在配置前先了解bean元素的相关属性:
作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦。这一切都离不开Spring 配置文件中使用的元素。
Spring 容器可以被看作一个大工厂,而 Spring 容器中的 Bean 就相当于该工厂的产品。如果希望 这个大工厂能够生产和管理 Bean,这时则需要告诉容器需要哪些 Bean,以及需要以何种方式将这些 Bean 装配到一起
常用的属性
bean 的id 和 name的区别:
id和name都是spring 容器中bean 的唯一标识符。
- id: 一个bean的唯一标识 , 命名格式必须符合XML ID属性的命名规范
- name: 可以用特殊字符,并且一个bean可以用多个名称:name=“bean1,bean2,bean3”,用逗号 或者分号或者空格隔开。如果没有id,则name的第一个名称默认是id
spring 容器如何处理同名bean?(同名bean:多个bean 有相同的 name 或者 id,称之为同名bean)
*同一个spring配置文件中,bean的 id、name是不能够重复的,否则spring容器启动时会报错。
*如果一个spring容器从多个配置文件中加载配置信息,则多个配置文件中是允许有同名bean的,并且后面加载的配置文件的中的bean定义会覆盖前面加载的同名bean。
1、在spring同一个配置文件中,不能存在id相同的两个bean,否则会报错。
2、在两个不同的spring配置文件中,可以存在id相同的两个bean,启动时,不会报错。这是因为 spring ioc容器在加载bean的过程中,类DefaultListableBeanFactory会对id相同的bean进行处理:后加载的配置文件的bean,覆盖先加载的配置文件的bean。DefaultListableBeanFactory类中,有个 属性allowBeanDefinitionOverriding,默认值为true,该值就是用来指定出现两个bean的id相同 的情况下,如何进行处理。如果该值为false,则不会进行覆盖,而是抛出异常。
spring 容器如何处理没有指定id、name属性的bean?
*如果 一个 bean 标签未指定 id、name 属性,则 spring容器会给其一个默认的id,值为其类全名。
*如果有多个bean标签未指定 id、name 属性,则spring容器会按照其出现的次序,分别给其指定 id 值 为 “类全名#1”, “类全名#2”
1、 Spring XML配置方式配置Bean
创建com.gx.model.User类 用于演示:
1、 在src目录下创建applicationContext.xml配置文件,并配置好bean元素
2、 创建一个测试类com.gx.test.Demo:
以上就是Spring XML的配置方式,以下的注解为Junit4常用的注解
在引用时需要导入hamcrest-all-1.3.jar架包,使用Spring5+Junit4是一个为了测试为目的,且能组合成灵活表达式的匹配器类库。
执行的顺序为:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
在Test注解中有两个属性timeout测试运行毫秒、expected期望出现异常
2、基于Java注解的配置方式
应用中 Bean 的数量较多时会导致XML配置文件臃肿,因此可以使用注解方式配置解决。
·@Component
可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),
并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可,默认情况下生成的id名称为类
名称的首字母小写。
·@Repository
用于将数据访问层(DAO层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
·@Service
通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与@Component 相同。
·@Controller
通常作用在控制层,用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。
·@Autowired
默认按照 Bean 的类型进行装配。
用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注,配合对应的注解处理器完成Bean 的自动配置工作。
·@Resource
其作用与 Autowired 一样。
其区别在于 @Autowired 默认按照 Bean 类型装配,而 ·@Resource 默认按照 Bean 实例名称进行
装配。
·@Resource 中有两个重要属性:name 和 type。
Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name
属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。
如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果
都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。
·@Qualifier
与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,
Bean 的实例名称由 @Qualifier 注解的参数指定。
·@value
给属性赋值
一、编写com.gx.model.UserAnnotation类 并配置@Component注解:
在使用Component注解时要注意若不声明value属性值时:
会根据类名生成默认的名称:
当类名以一个大写字母开头时,bean的名字为首字母小写的类名
例如:User->user IdCard->idCard
当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致
例如:URL->URL XDMuu->XDMuu
*使用注解相当于告诉Spring创建一个name为userAnnotation的bean
二、在applicationContext.xml配置文件中添加注解扫描的配置:
三、编写测试方法:
3、 基于类的配置方式@Configuration:
使用XML案例的com.gx.model.User包下的User类
一、 编写 SpringBeanConfig 类:
使用该注解相当于,SpringBeanConfig为配置文件
二、 编写测试方法: