Spring中的Bean配置
IOC & DI概述
1. IOC(控制反转):器思想是反转资源获取的方向。
1) 传统:资源查找方式要求组件向容器发起请求查找资源。作为回应回应,容器适时的返回资源。
2) IOC:容器主动地将资源推送给它所管理的组件,组件所要做的就是选择一种合适的方式来接受资源。
2. DI(依赖注入):IOC的另一种表达方式:组件以一些预先定义好的方式(setter方法)接受来自如容器的资源注入。
Bean:基于XML文件的方式
1. 属性注入:通过属性的setter方法注入属性值。(常用)
1) Id:用于在java文件中找到指定的bean。
2) Class:指定Bean的类文件名称。
3) Property:子标签,用来为bean中的属性赋值。
a) Name:属性名称
b) Value:变量值
2. 构造器注入属性值(常用)
1) 要求:Bean中有相应的构造器。
2) 若一个Bean中有多个构造器,可以通过index和type进行更加精确的定位.
3) 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. (了解)
<constructor-arg>
<value><![CDATA[<ATARZA>]]></value>
</constructor-arg>
3. Bean配置细节
1) 属性为一个对象的配置(常用)
a) 通过ref属性值指定当前属性指向哪一个bean。
b) 使用内部bean的方式,内部bean不能被外部的bean来引用。
2) 设置级联属性(了解)
注意:在使用级联属性时,这里Service对象属性必须先初始化,即指定一个bean的引用。否则使用级联时,由于Service没有初始化,即为NULL,获取属性时会报错。
3) 设置空属性(了解)
4) 装配集合属性
a) 对List集合的配置:使用property的子标签list来配置属性
注:在list标签内同样可以使用内部bean的方式来创建list容器中的一个实体对象。
b) 对map集合的配置:与list类似。使用property子标签map来配置。
使用map下子标签entry,配置Map类型的成员变量。
5) 通过utl声明外部集合类型
好处:在外部任何一个bean中都能通过ref应用的方式来使用同一个外部集合,即实现了不同Bean之间的集合共享。
6) 为Properties类型对象配置属性值
7) P命名空间的使用
a) 可以简化bean中属性的赋值。
b) 注:需要导入p命名空间。
4. 自动装配
1) 在 <bean> 的 autowire 属性里指定自动装配的模式
2) byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
3) byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
4) 缺点:
a) 若只希望装配个别属性时, autowire 属性就不够灵活了。
b) autowire 属性要么根据类型自动装配,要么根据名称自动装配, 不能两者兼而有之。
5. bean之间的关系:继承和依赖
1) 继承
Ø 子Bean从父Bean中继承配置,即属性配置。同时也可以覆盖从父Bean中继承的属性值。类似于父类和子类的关系。
Ø 可通过abstract=true,将父Bean设置为一个纯的模板Bean。此时父Bean不能被实例化。
Ø 父Bean也可以忽略class属性,此时父Bean的abstact属性必须置为true。
2) 依赖
Ø Bean可以通过depends-on属性设定Bean的前置依赖Bean。此时这个前置依赖Bean必须在本Bean实例化之前创建好。即不能为空。
Ø 如果前置依赖有多个,则可以通过逗号,空格或的方式配置 Bean 的名称
Ø 依赖的这个Bean不一定是本Bean中的属性。
6. Bean的作用域
1) 使用Bean的scope属性来配置bean的作用域。
2) Singleton:默认值。容器初始时创建bean的实例。在整个容器的生命周期中只创建这一个bean,即单例的。
3) Prototype:原型的。容器初始化时不创建bean的实例。而在每次请求时都创建一个新的Bean实例,并返回。
7. 使用外部属性文件
1) Spring 提供了一个PropertyPlaceholderConfigurer 的BeanFactory 后置处理器,
a) 这个后置处理器将Bean 配置的部分内容外移到属性文件中。可以在 Bean 配置文件里使用形式为${var} 的变量。
b) PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量。
2) Spring 还允许在属性文件中使用${propName},以实现属性之间的相互引用
8. SpELl语言
1) 字面值表示:<property name="count" value="#{5}"/>
2) 引用其他Bean对象:
3) 引用其他Bean对象的属性:
4) 链式操作,调用Bean对象方法
5) 逻辑运算、字符串连接、比较运算、逻辑运算符、if-else变体和正则表达式
6) 调用静态方法或静态属性:通过T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性。
9. IOC容器中Bean的生命周期(相对而言重要,要能说出来)
1) Bean的声明里设置init-method和destory-method属性,为 Bean 指定初始化和销毁方法。
2) Bean后置处理器
Ø 作用:在调用init()方法【前】、【后】对Bean进行额外的处理。
Ø 应用:检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性。
Ø 实现BeanPostProcessor接口,并实现两个方法。
Ø 在配置文件中配置。
Ø Bean的后置处理器对IOC容器里的所有Bean实例都进行处理。
3) Spring IOC容器对Bean的生命周期进行管理的过程
a) 通过【构造器】或工厂方法创建 Bean 实例
b) 为 Bean 的【属性设置值】和对其他 Bean 的引用
c) 将 Bean实例传递给 Bean后置处理器的 postProcessBeforeInitialization 方法
d) 调用 Bean 的初始化方法
e) 若有指定init-method,则执行这个方法
f) 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
g) 使用Bean
h) 当容器关闭时,器生成的Bean同时销毁,若指定destory-method方法则执行对应的方法
10. 通过工厂创建Bean
1) 通过静态工厂方法来配置Bean
Ø Class:指向静态工厂方法的全类名。
Ø Factory-method:指向静态工厂方法的名字。
Ø Constructor-arg:如果工厂方法需要传入参数,通过这个子标签来配置。
2) 通过工厂实例方法来配置Bean
a) 配置实例工厂
<bean id="carFactory" class="com.atguigu.spring,bean.factory.InstanceCarFactory"/>
b) 通过实例工厂方法来配置Bean
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="ford"/>
</bean>
Ø factory-bean:指向某工厂实例ID。
Ø factory-method:指向工厂方。
基于注解的方式
1. 特定组件(在Bean中设置)
1) @Component: 基本注解, 标识了一个受 Spring管理的组件
2) @Respository: 标识持久层组件
3) @Service: 标识服务层(业务层)组件
4) @Controller: 标识表现层组件
2. 对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称
3. 当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明<context:component-scan> :
1) base-package:属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类. 当需要扫描多个包时, 可以使用逗号分隔.
2) resource-pattern:扫描特定的类而非基包下的所有类。
4. 子节点
1) <context:include-filter>:表示要包含的目标类
2) <context:exclude-filter>:表示要排除在外的目标类
5. <context:component-scan> 下可以拥有若干个<context:include-filter> 和 <context:exclude-filter> 子节点