PostProcessor的种类:
大类分为容器级别的后置处理器和 Bean 级别的后置处理器
-
BeanDefinitionRegistryPostProcessor
BeanDefinition 的自定义注册
/** * @author wsq * @version CustomizedBeanDefinitionRegistryPostProcessor.java 2020/6/29 上午9:02 上午 * 这个功能可以做什么事情?可以在这个接口里面搜索第三方的 Class,并将这些Class注册进Spring 容器中,这样就可以在复用第三方 * 代码;mybatis框架就是这么做的 */ @Configuration public class CustomizedBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { Class<?> userClass = User.class; BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(userClass); GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition(); registry.registerBeanDefinition("user5", definition); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
-
BeanFactoryPostProcessor
容器后置处理器
-
BeanPostProcessor
Bean的后置处理器,容器创建的每个Bean实例,创建Bean已经是依赖注入部分的知识了。容器创建的Bean实例,后置器都会在调用容器初始化之前和Bean实例初始化之后,都可以从容器获得回调执行。
@Configuration public class CustomizedBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName + "调用了 postProcessBeforeInitialization"); //对 bean做任何操作,处理 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(beanName + "调用了 postProcessAfterInitialization"); //对 bean做任何操作,处理 return bean; } }
public static void main(String args[]) {
System.out.println("Spring 项目成功编译!!!!走注解使用Spring");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Entrance.class);
WelcomeService ws = (WelcomeService) applicationContext.getBean("welcomeServiceImpl");
ws.sayHello("wsq");
WelcomeController controller = (WelcomeController) applicationContext.getBean("welcomeController");
controller.doRequest();
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
User user5 = (User) applicationContext.getBean("user5");
System.out.println("CustomizedBeanDefinitionRegistryPostProcessor 注册的额外对象" + user5);
}
输出:
Spring 项目成功编译!!!!走注解使用Spring
entrance调用了 postProcessBeforeInitialization
entrance调用了 postProcessAfterInitialization
welcomeServiceImpl调用了 postProcessBeforeInitialization
welcomeServiceImpl调用了 postProcessAfterInitialization
welcomeController调用了 postProcessBeforeInitialization
welcomeController调用了 postProcessAfterInitialization
welcomeDao调用了 postProcessBeforeInitialization
welcomeDao调用了 postProcessAfterInitialization
user5调用了 postProcessBeforeInitialization
user5调用了 postProcessAfterInitialization
Hellow :wsq
Hellow :来自Controller的调用问候
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
entrance
welcomeController
welcomeDao
customizedBeanDefinitionRegistryPostProcessor
customizedBeanPostProcessor
welcomeServiceImpl
user5
CustomizedBeanDefinitionRegistryPostProcessor 注册的额外对象cn.com.yuns.entity.User@2c34f934
网友评论