@DependsOn을 온라인으로 구현하는 방법은 여러 가지가 있지만 종속 Bean 수가 적으면 더 쉽지만 수가 늘어나면 번거로워집니다. 클래스를 다시 작성해야 하므로 두 번째 방법을 권장합니다.
ApplicationContextInitializer를 등록한 후 Spring에서 BeanDefinitionRegistryPostProcessor를 등록할 수 있습니다. 마지막으로 BeanDefinitionRegistryPostProcessor를 구현하여 대상 Bean을 등록합니다.
class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
Implement 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; } }
BeanDefinitionRegistryPostProcessor를 등록하기 위해 @Componet이나 다른 주석을 사용할 수 없다는 점에 유의해야 합니다.
@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는 자체 빈을 먼저 로드하기 위해 어떻게 선택합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!