@DependsOn をオンラインで実装する方法は多数ありますが、依存する Bean の数が少ない場合は、の方が簡単ですが、数が増えると面倒になり、各クラスを書き換える必要があるため、2番目の方法をお勧めします。
ApplicationContextInitializer を登録した後、Spring で BeanDefinitionRegistryPostProcessor を登録できます。最後に、BeanDefinitionRegistryPostProcessor を実装して対象の Bean を登録します。
class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
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; } }
@Componet またはその他のアノテーションを BeanDefinitionRegistryPostProcessor の登録に使用できないことに注意してください。
@Componet アノテーション メソッドは、ConfigurationClassPostProcessor によってスキャンされる場合にのみ登録できるため、これらの Bean の前に Bean の登録を考慮する必要があるため、「it-ConfigurationClassPostProcessor」によって管理されてはなりません。別の角度から考えると、「it」管理クラスによって登録された Bean は、ConfigurationClassPostProcessor より前にランク付けされてはなりません。
注: @Order は Spring 自身の Bean の順序のみを制御でき、アノテーション @Service @Component および @Repository は制御できません。
要件: 作成者は、TestService を事前に登録し、実行後にのみ他の Bean を登録できるようにしたいと考えています。
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); } }
実装: (簡単にするために、上記の 3 つのインターフェイスを直接実装します)
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()); } }
以上がSpringBoot はどのようにして独自の Bean を最初にロードすることを選択するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。