本章节目录:
(一)后 置 处 理 器 PostProcessor
(二)Aware 接 口 及 其 子 接 口
(一)后 置 处 理 器 PostProcessor
PostProcessor:
本身也是一种需要注册到容器里的Bean
其里面的方法会在特定的时机被容器调用
实现不改变容器或者Bean核心逻辑的情况下对Bean进行拓展
对Bean进行包装,影响其行为、修改Bean的内容等
PostProcessor的种类:
大类分为容器级别的后置处理器以及Bean级别的后置处理器
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
BeanPostProcessor
BeanDefinitionRegistryPostProcessor的使用:
下面代码意为:在BeanDefinitionRegistry注册BeanDefinition之前调用方法。执行完方法后我们就可以在容器中获取到该Bean
@Configuration
public class CustomizedBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Class<?> clazz = User.class;//新建User的Class对象
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);//将Class对象获取到创建BeanDefinition的工具类
GenericBeanDefinition definition = (GenericBeanDefinition)builder.getRawBeanDefinition();//通过工具类创建BeanDefinition
registry.registerBeanDefinition("user",definition);//调用注册器 注册BeanName为“user”,BeanDefinition为刚刚新建的对象。
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}
BeanPostProcessor的使用:
下面代码意为:在Bean注册创建之前(之后)调用方法。
@Configuration
public class CustomizedBeanPostProcessor implements BeanPostProcessor {
//Bean创建前调用
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "调用了postProcessBeforeInitialization()");
return bean;//返回Bean提供后续创建
}
//Bean初始化好之后调用
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName + "调用了postProcessAfterInitialization()");
return bean;
}
}
(二)Aware 接 口 及 其 子 接 口
Aware:
从Bean里获取到的容器实例并对其进行操作
该接口是个空的接口,并没有什么作用,只能当作标签使用
该接口的主要作用体现在它的子类中
Aware的关系图:(常用的子接口)
![](https://i-blog.csdnimg.cn/blog_migrate/fa681b40c042c8fd22e8beb6462edb0d.png)
ApplicationContextAware接口主要一个方法setApplicationContext() :实现了该接口的Bean在容器创建这个Bean的实例时,将容器本身的实例作为参数传递给这个Bean使用
BeanFactory接口:获取当前的BeanFactory提供调用服务
ResourceLoaderAware:主要就是用来获取资源加载器的
BeanNameAware接口主要一个方法setBeanName(String name):实现了该接口的Bean,可以将Bean的名字传递进来供该接口使用。