SpringBean详解
前言
在Spring
中,类的创建不再由new
进行,而是交给Spring
通过xml
文件进行反射创建,这种叫做控制反转IoC
(Inversion of Control
),也叫做依赖注入DI
(Dependency Injection
)。
简单的Bean例子
导入maven项目
创建一个Person
类,并在xml中配置bean信息
1 |
|
在测试类中通过ApplicationContext
进行创建对象
1 |
|
Bean的生命周期
- Bean先new进行
实例化
- 然后
注入属性
。 - 若实现了
BeanNameAware
接口,将Bean的ID
传入setBeanName()
方法。 - 若实现了
BeanFactoryAware
接口,将BeanFactory容器实例传入setBeanFactory()
方法。 - 若实现了
ApplicationContextAware
接口,通过setApplicationContext()
方法获取应用上下文。 - 调用
BeanPostProcessor
后处理器的预初始化方法。 - 调用
InitializingBean
接口afterPropertiesSet()
方法。 - 配置文件
bean
标签下的init-method
属性指定的方法
。 - 配置文件
beans
标签下的default-init-method
全局属性指定的方法
。 - 调用
BeanPostProcessor
后处理器的预初始化后方法。 - 使用Bean
- 调用
DisposableBean
接口destory
方法。 - 配置文件
bean
标签下的destory-method
属性指定的方法
。 - 配置文件
beans
标签下的default-destory-method
全局属性指定的方法
。
Bean的创建
Bean
的创建都交由xml
配置文件执行,获取Bean
实例都是通过getBean
方法进行。
普通new创建
1 | <beans> |
静态工厂创建
需要一个静态工厂类
1 | public class BeanFactory{ |
在xml
文件中配置,指定factory-method
属性,获取实例用getBean()
方法即可
1 | <beans> |
实例工厂创建
需要一个工厂类,注意这里和静态工厂的不同是不用static
修饰方法
1 | public class BeanFactory{ |
在xml
文件中配置,指定factory-method
属性,获取实例用getBean()
方法即可
1 | <beans> |
工厂Bean创建
工厂Bean
继承自FactoryBean
1 | public class PersonFactory implements FactoryBean<Person> { |
在spring-bean.xml
中配置,获取BeanFactory
时使用&chinese
1 | <beans> |
和上面一样使用
1 |
|
scope作用域
在bean
标签中的scope
属性有五个值
singleton
:单例模式,整个Spring容器中只有一个实例prototype
:原型模式,每次通过getBean方法都将产生一个新的实例request
:对每次request请求,都会产生一个新的实例session
:对每次session会话,都会产生一个新的实例global session
:spring-bean-scopes-session-and-globalsession
其中request
、session
在Servlet2.4
以上要在web.xml
中配置Listener
在Servlet2.4
以下要在web.xml
中配置Filter
并且要导入maven项目1
2
3
4
5
6
7
8
9
10
11
12
13<web-app>
<listener><!--Servlet2.4以上-->
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<filter><!--Servlet2.4以下-->
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
自动装配注入
自动装配减少了配置文件的工作量,但降低了依赖关系的透明性和清晰性。
显示指定的依赖会覆盖自动装配的依赖
byName规则
在bean
标签添加autowire="byName"
属性,当A
类中有setB
方法,且beans
中有id
为b
的bean
,则自动装配注入。
1 | <beans> |
byType规则
在bean
标签添加autowire="byType"
属性,当A
类中有B
类型的Field
,且beans
中只有一个B
类型或者B
的子类型的bean
,则自动装配注入。
如果有多个匹配的bean
,则抛出异常,使用autowire-candidate="false"
即可忽略该bean
。
1 | <beans> |