Spring Bean
1.Bean生命周期
一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段(如图1.1):
1.1 详细步骤:
在说明前可以思考一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean也类似,如下
1、实例化一个Bean--也就是我们常说的new;
2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
1.2 简单来说分了五个步骤:
1. 通过构造方法或工厂方法创建bean实例
- 为bean属性设置值和对其他bean的引用
- 调用bean的初始化方法 (init -method),可以用PostConstruct初始化方法的注解方式
- bean可以使用了
- 当容器关闭时,调用bean的销毁方法 ( destory-method),等同于@PreDestroy
注意:
在xml文件中配置bean的时候就可以指定init-method 和的story-method
1.3 细化
当加入了bean的前置和后置处理器之后,就会在init方法前后分别调用
方式:实现BeanPostProcessor接口
前置:提供postProcessBeforeInitialization(Object bean ,String beanName)方法实现 init-method 之前调用
后置:提供postProcessAfterInitialization(Object bean ,String beanName)方法实现 init-method之后调用
返回值是实际上返回给用户的那个bean,
可以两个方法中返回的bean,甚至返回一个新的bean
xml文件配置后置处理器:
不需要配置id,只要实现了BeanPostProcessor接口,IOC会自动识别它是后置处理器
<bean class="后置处理器的路径地址/>"
注意:后置处理器是处理所有 bean的,如果要特殊处理某个bean
1.4 细化之后
现在的生命周期:
1. 通过构造方法或工厂方法创建bean实例
- 为bean属性设置值和对其他bean的引用
-
- 将bean实例传递给bean后置处理器的postProcessBeforeInitialization方法
- 调用bean的初始化方法 (init -method)
-
- 将bean实例传递给bean后置处理器的postProcessAfterInitialization方法
- bean可以使用了
- 当容器关闭时,调用bean的销毁方法 ( destory-method)
参考博客:
2.实例化Bean的方式
示例参考
2.1 通过工厂来注入bean
2.1.1 通过调用某一个类的类的静态方法来返回bean实例
2.2.2 非静态方法来配置bean
先写一个实例工厂的类
2.2.3 通过spring提供的FactoryBean来注入bean
3. 注入Bean的方式
用bean标签将java的bean交由spring IOC 管理
3.1 通过构造方法注入bean
index表示参数的顺序,name表示参数名称,type类型,ref 引用, value 字面量;
简便写法:
3.2 通过set方法注入bean
3.3 集和类型Bean注入
3.4 注入null值
3.5 注入内部bean
4. Bean的作用域
4.1 singleton作用域
同一个上下文每次获取到的bean实例是同一个
4.2 prototype作用域
每次返回的bean的实例是新创建的
如何让singleton的bean1,prototype的bean2 返回多个bean2实例呢
在class bean1里去掉原来的setter方式参数私有属性域注入bean2
改为以方法的形式获取bean2
变成一个抽象方法,
4.3 Web环境作用域
4.4 自定义作用域-simpleThread
每一个线程有一个单独的实例