springboot自定义实现启动时决定装载哪些Bean

在Spring Boot中,可以通过多种方式来自定义控制启动时加载哪些Bean。以下是一些常见的策略:

1. 条件化Bean创建 (@Conditional)

Spring Boot大量使用了@Conditional注解来决定是否应该创建或配置某个Bean。你可以自定义条件类实现org.springframework.context.annotation.Condition接口,并在自定义Bean上使用@Conditional配合你自己的条件类来决定何时加载Bean。

例如:

// 自定义条件类
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 这里可以根据环境变量、配置属性或者其他条件判断是否满足加载Bean的条件
        return context.getEnvironment().getProperty("my.custom.property") != null;
    }
}

// 在Bean上应用条件
@Configuration
public class MyConfiguration {

    @Bean
    @Conditional(MyCondition.class)
    public MyBean myBean() {
        return new MyBean();
    }
}

2. 自定义 Starter 和 Auto Configuration

可以编写自定义的Starter模块,它包含自定义的Auto Configuration类。在Auto Configuration类中,利用@ConditionalOn...系列注解(如@ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty等),基于类的存在性、其他Bean的存在或者特定的配置属性值来决定是否自动配置和加载Bean。

// 自定义starter中的Auto Configuration
@Configuration
@ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true")
public class MyFeatureAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

3. 监听事件 (ApplicationListener)

可以通过实现ApplicationListenerSmartLifecycle接口,创建一个监听Spring Boot启动完成事件的Bean,然后在这个监听器中按需加载额外的Bean。

@Component
public class StartupLoader implements ApplicationListener {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        if (shouldLoadMyBean()) {
            applicationContext.getBeanFactory().registerSingleton("myBean", new MyBean());
        }
    }

    private boolean shouldLoadMyBean() {
        // 根据某种逻辑判断是否应该加载MyBean
    }
}

4. 使用Spring Boot的Bootstrap阶段

对于非常早期的启动阶段需求,还可以使用spring.factories文件注册org.springframework.boot.BootstrapRegistryInitializer以在bootstrap阶段就加载某些特殊的Bean。

总之,在Spring Boot中,自定义启动时的Bean加载策略主要依赖于条件注解、自定义Starter模块以及对生命周期事件的监听和响应机制。