京东可以免费做特效的网站,广州新媒体运营公司排行榜,佛山网站建设公司怎么选,g3云推广官网在 Spring 的 bean 装载条件中#xff0c;虽然 Spring 给我们提供了非常好用便捷的 Condition 相关注解#xff0c;但是很多时候 Condition 相关注解并不满足我们的需求#xff0c;我需要更复杂的条件手动控制是否装置 bean。这个时候我们就可以实现 Spring 为我们提供的几个…在 Spring 的 bean 装载条件中虽然 Spring 给我们提供了非常好用便捷的 Condition 相关注解但是很多时候 Condition 相关注解并不满足我们的需求我需要更复杂的条件手动控制是否装置 bean。这个时候我们就可以实现 Spring 为我们提供的几个接口来实现手动 bean 的注入。 
一、ApplicationContextAware 接口 
在某些特殊的情况下bean 需要实现某个功能但该功能必须借助于 Spring 容器才能实现此时就必须让该 bean 先获取 Spring 容器然后借助于 Spring 容器实现该功能。为了让 bean 获取它所在的 Spring 容器可以让该 bean 实现 ApplicationContextAware 接口。ApplicationContextAware 通过它 Spring 容器会自动把上下文环境对象调用ApplicationContextAware 接口中的 setApplicationContext 方法。在 ApplicationContextAware 的实现类中就可以通过这个上下文环境对象得到 Spring 容器中的 bean。 
Component
public class MyContextAware implements ApplicationContextAware {Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println(SpringWebSocketContextAware);// 将 applicationContext 转换为 ConfigurableApplicationContextConfigurableApplicationContext configurableApplicationContext  (ConfigurableApplicationContext) applicationContext;// 获取 BeanFactoryDefaultListableBeanFactory defaultListableBeanFactory  (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();// 创建 bean 信息BeanDefinitionBuilder beanDefinitionBuilder  BeanDefinitionBuilder.genericBeanDefinition(Test.class);// 动态注册 beandefaultListableBeanFactory.registerBeanDefinition(test, beanDefinitionBuilder.getBeanDefinition());}
} 二、BeanDefinitionRegistryPostProcessor 接口 
Spring 中并没有具体去实现 postProcessBeanFactory 方法是提供给想要实现BeanPostProcessor 的三方框架使用的。谁要使用谁就去实现。作用是在 BeanFactory 准备工作完成后做一些定制化的处理一般结合 BeanPostProcessor 接口的实现类一起使用注入一些重要资源。 
Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {BeanDefinition beanDefinition  BeanDefinitionBuilder.rootBeanDefinition(Test.class).getBeanDefinition();registry.registerBeanDefinition(test, beanDefinition);}Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {BeanDefinitionRegistryPostProcessor.super.postProcessBeanFactory(beanFactory);}
} 
三、ImportBeanDefinitionRegistrar 接口 
在 spring 应用启动过程一些被 Import 注解的类这些类都实现了 ImportBeanDefinitionRegistrar 接口会执行 ImportBeanDefinitionRegistrar 的registerBeanDefinitions 方法然后生成 BeanDefinition 对象并最终注册到BeanDefinitionRegistry 中为后续实例化 bean 做准备的。 
Component
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {Overridepublic void registerBeanDefinitions(NotNull AnnotationMetadata importingClassMetadata,NotNull BeanDefinitionRegistry registry,NotNull BeanNameGenerator importBeanNameGenerator) {this.registerBeanDefinitions(importingClassMetadata, registry);}Overridepublic void registerBeanDefinitions(NotNull AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {BeanDefinition beanDefinition  BeanDefinitionBuilder.rootBeanDefinition(Test.class).getBeanDefinition();registry.registerBeanDefinition(test, beanDefinition);ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry);}
} 
接口执行顺序ImportBeanDefinitionRegistrar - BeanDefinitionRegistryPostProcessor - ApplicationContextAware