Il existe de nombreuses méthodes d'implémentation en ligne pour cela @DependsOn , selon Si le nombre de beans est petit, c'est plus facile à faire, mais lorsque le nombre augmente, cela devient plus gênant. Chaque classe doit être réécrite, donc la deuxième méthode est recommandée.
Après avoir enregistré ApplicationContextInitializer, vous pouvez enregistrer BeanDefinitionRegistryPostProcessor au printemps. Enfin, implémentez BeanDefinitionRegistryPostProcessor pour enregistrer le bean cible.
class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
Implementing BeanDefinitionRegistryPostProcessor :
public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { // 重点在这里,这里可以把自己的 想要提起 实现的 或者初始化的 bean 加到这里 beanDefinitionRegistry.registerBeanDefinition("DemoService",new RootBeanDefinition(DemoService.class)); } // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } // from PriorityOrdered interface @Override public int getOrder() { // 排在 ConfigurationClassPostProcessor 之前即可 return Ordered.LOWEST_PRECEDENCE - 1; } }
Il convient de noter que @Componet ou d'autres annotations ne peuvent pas être utilisées pour enregistrer BeanDefinitionRegistryPostProcessor.
Parce que la méthode d'annotation @Componet ne peut être enregistrée que si elle est analysée par ConfigurationClassPostProcessor. Maintenant, nous devons considérer l'enregistrement de notre bean avant ces beans, il ne doit donc pas être géré par "it-ConfigurationClassPostProcessor". . En y réfléchissant sous un autre angle, si les beans enregistrés par la classe de gestion "it" ne doivent pas être classés devant ConfigurationClassPostProcessor.
Remarque : @Order ne peut contrôler que l'ordre des propres beans de Spring. Il ne peut pas contrôler les annotations @Service @Component et @Repository.
Exigence : L'auteur souhaite que TestService soit enregistré à l'avance, et ce n'est qu'après l'exécution que d'autres beans peuvent être enregistrés.
public class TestService { // 存放系统配置 private static Map<String, String> GLOBAL_CONF = new HashMap<>(); @PostConstruct public void init() { // 先做初始化 GLOBAL_CONF 或者其他 IO操作 // GLOBAL_CONF.put(key, value); } //其他 bean 通过这个方法获得系统配置 public static String getGlobalConfig(String key) { return GLOBAL_CONF.get(key); } }
Implémentation : (Pour plus de simplicité, implémentez directement les 3 interfaces ci-dessus)
public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, ApplicationContextInitializer<ConfigurableApplicationContext> { /** * 第二步: 注册 自己的 bean * * @param beanDefinitionRegistry */ // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { beanDefinitionRegistry.registerBeanDefinition("TestService",new RootBeanDefinition(TestService.class)); } // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } // from PriorityOrdered interface @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE - 1; } /** * 第一步 先注册 到 configurableApplicationContext 中 * * @param configurableApplicationContext */ // from ApplicationContextInitializer interface @Override public void initialize(ConfigurableApplicationContext configurableApplicationContext) { configurableApplicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!