一、Bean种类
1.1 普通bean:之前操作的都是普通bean <bean id ="" class=""/> ,spring直接创建实例,并返回
1.2 FactoryBean:是一个特殊的bean,具有工厂生成对象能力,只能生成特定的对象
bean必须使用FactoryBean接口,此接口提供方法getObject(),用于获得特定bean
<bean id="" class="FB"/> 先创建FB实例,使用调用getObject()方法,并返回方法的返回值
FB fb = new FB();
return fb.getObject();
1.3 BeanFactory 和 FactoryBean 对比
BeanFactory:工厂用于生成任意bean
FactoryBean: 特殊bean,用于生成另一个特定的bean;例如:ProxyFactoryBean,此工厂bean用于生产代理
<bean id = "" class="....ProxyFactoryBean"/> 获得代理对象实例。AOP使用
二、作用域:用于确定Spring创建bean实例个数
取值:
singleton 单例,默认值
prototype 多例,每执行一次getBean将获得一个实例,例如:struts整合spring,配置action多例
配置方法
<bean id ="" class="" scope="prototype" >
</bean>
三、生命周期
3.1 初始化和销毁
applicationContext配置文件
3.2 BeanPostProcessor 后处理Bean
BeanPostProcessor: spring提供一种机制,只要实现此接口BeanPostProcessor,并将实现类提供给spring容器,spring容器将自动执行,在初始化方法前执行
before(),在初始化方法后执行after()
spring 提供工厂钩子,用于修改实例对象,可以生成代理对象,是AOP低层
模拟:
A a =new A();
a = B.before(a) --> 将a的实例对象传递给后处理bean,可以生成代理对象并返回。
a.init();
a = B.after(a);、
a.addUser(); //生成代理对象,目的在目标方法前后执行(例如:开启事务、提交事务
a.destroy()
案例:
applicationContext配置文件
注意:注册的后处理bean是作用所有bean,如果想要作用一个bean 可以使用 MybeanPostProcessor方法
postProcessAfterInitialization(final Object bean, String beanName) 利用参数2 beanName进行判断是否需要生成动态代理