Spring 备忘 (四) -- Spring 后处理器
Spring 备忘 (四) -- Spring 后处理器
?
20. Spring 后处理器 - Bean 后处理器
? ? bean后处理器,是一种特殊的bean,这种bean不对外提供服务,甚至无需id属性,
? ? 负责对其容器中其他bean提供后处理.
? ??
? ? 这种bean是对所有的(或一大批)其他bean进行处理,
? ? 区别于:
? ? ? bean单独配置init-method或者实现InitializingBean(仅仅对当前的bean做处理)
? ? ? bean单独配置destory-method属性 或者 实现 DisposableBean接口(仅仅对当前的bean做处理)
? ??
? ? bean后处理器必须实现 BeanPostProcessor接口,包含下面方法:
? ? Object postProcessBeforeInitialization(Object bean,String name) Throws BeansException
? ? Object postProcessAfterInitialization(Object bean,String name) Throws BeansException
? ? 第一个参数是即将进行后处理的bean实例,第二个参数是该bean的名字
? ? 这两个方法会在bean初始化前,后分别被调用
? ? 一个类MyBeanPostProcessor实现了BeanPostProcessor接口
? ??
? ? 配置片段:
? ? <bean id="steelAxe" />
? ??
? ? <!-- Chinese类还实现了InitializingBean 接口 -->
? ? <bean id="chinese" init-method="init">
? ? ? <!-- 设置注入 -->
? ? ? <property name="axe" ref="steelAxe" />
? ? ? <property name="name" value="依赖注入的值" /> ?
? ? </bean>
? ??
? ? <!-- 配置bean的后处理器可以无需指定id,但这里还是指定了 -->
? ? <bean id="beanPostProcessor" />
? ??
? ? 几种方法的调用顺序:
? ? (1) 注入依赖关系(set方法之类的)
? ? (2) 调用后处理器接口方法 postProcessBeforeInitialization
? ? (3) 调用具体Bean的InitializingBean接口方法afterPropertiesSet()
? ? (4) bean配置的init-method中指定的方法
? ? (5) 调用具体Bean的DisposableBean接口方法destroy()
? ? (6) 调用bean配置的destroy-method中指定的方法(P599)
? ? (7) 调用Bean后处理器接口的 postProcessAfterInitialization(P616)
? ??
? ??
? ? 使用BeanFactory作为Spring容器需要手动注册Bean后处理器,
? ? 使用ApplicationContext则会自动注册Bean后处理器.
? ??
21. Spring 后处理器 -- 容器 后处理器
? ??
? ? 容器后处理器处理容器本身.
? ? 实现BeanFactoryPostProcessor接口,方法为:
? ? postProcessorBeanFactory(ConfigurableListableBanFactory beanFactory)
? ? 该方法对Spring容器进行后处理,并不完全替换容器,所以不需要返回值.
? ??
? ? 使用BeanFactory作为Spring容器需要手动注册 容器 后处理器,
? ? 使用ApplicationContext则会自动注册 容器 后处理器.
? ??
? ? 配置: 将 容器 后处理器,作为普通bean 配置到xml配置文件中.(P618)
? ??
? ? 两种容器配置器(P620):
? ? ? 属性占位符配置器(PropertyPlaceholderConfigurer)
? ? ? 重写占位符配置器(PropertyOverrideConfigurer)
? ??
? ??
? ??
??