- 摘要:BeanPostProcessor接口如果我们需要在spring容器完成Bean的实例化,配置和其他的初始化前后添加一些自己的逻辑处理,就可以使用BeanPostProcessor接口Bean的实例化过程@ComponentpublicclassUserimplementsApplicationContextAware,InitializingBean{privateApplicationContextctx;@OverridepublicvoidsetApplication
BeanPostProcessor 接口如果我们需要在spring容器完成Bean的实例化,配置和其他的初始化前后添加一些自己的逻辑处理,就可以使用BeanPostProcessor接口
Bean的实例化过程
@Component
public class User implements ApplicationContextAware ,InitializingBean {
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext....");
ctx = applicationContext;
}
public User(){
System.out.println("User....");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet....");
}
}
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessBeforeInitialization....");
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization....");
return o;
}
}输出结果为:
User....
setApplicationContext....
postProcessBeforeInitialization....
afterPropertiesSet....
postProcessAfterInitialization....总结:
图片出自:http://uule.iteye.com/blog/2094549
注意:
初始化每个bean的时候都会调用BeanPostProcessor接口
BeanPostProcessor接口中的方法不能返回null,否则bean对象就会获取不到
spring中BeanPostProcessor接口的作用
可以在BeanPostProcessor接口中对指定bean做处理,返回代理对象spring中的 ApplicationContextAwareProcessor实现了BeanPostProcessor,这个类主要就是对Spring Aware 接口的实现.
@Override
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
//do something
invokeAwareInterfaces(bean);
return bean;
}
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}
动态注入bean
BeanPostProcessor接口实现类会在每个bean初始化的时候被调用
BeanFactoryPostProcessor接口实现类会在spring容器初始化的时候被调用一次
BeanDefinitionRegistryPostProcessor接口
BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口
BeanDefinitionRegistryPostProcessor接口中可以获取可以BeanDefinitionRegistry,BeanDefinitionRegistry可以用来动态注入bean
要注入的bean可以使用BeanDefinitionBuilder来生成
也可以使用AnnotationConfigApplicationContext对象的registerBeanDefinition方法来动态注入bean
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
BeanDefinitionBuilder beanBuilder = BeanDefinitionBuilder.rootBeanDefinition(Person.class);
beanBuilder.addPropertyValue("name", "bob");
beanBuilder.addPropertyValue("age",17);
beanDefinitionRegistry.registerBeanDefinition("person", beanBuilder.getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}
spring中BeanPostProcessor和BeanDefinitionRegistryPostProcessor 接口
最新推荐文章于 2023-03-05 16:14:12 发布