spring bean加载条件和顺序的方式 @Conditional家族和@Profile使用

文章介绍了SpringBoot中用于条件化加载bean的多种注解,如@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等,以及如何通过它们的组合使用来实现复杂的应用场景。示例展示了在不同条件满足时如何加载或配置bean,例如基于类的存在、配置属性的值、特定Bean的存在与否等。
摘要由CSDN通过智能技术生成

前言

在实际开发中,有部分的bean需要根据不同的项目环境、配置、甚至类信息来进行条件加载,本文介绍几种常用的根据条件判断是否加载bean的方式

1.Conditional家族注解简介

@ConditionalOnClass:当classpath下存在指定的类时,才会装配或者配置;
@ConditionalOnMissingClass:当classpath下不存在指定的类时,才会装配或者配置;
@ConditionalOnBean:当容器中存在指定的bean时,才会装配或者配置;
@ConditionalOnMissingBean:当容器中不存在指定的bean时,才会装配或者配置;
@ConditionalOnExpression:根据SpEL表达式的值来决定是否装配或者配置;
@ConditionalOnProperty:根据配置文件中指定的属性是否存在来决定是否装配或者配置;
@ConditionalOnResource:当classpath下存在指定的资源文件时,才会装配或者配置;
@ConditionalOnWebApplication:当应用是一个Web应用时,才会装配或者配置;
@ConditionalOnNotWebApplication:当应用不是一个Web应用时,才会装配或者配置;
@ConditionalOnJndi:当JNDI中存在指定的项时,才会装配或者配置;
@ConditionalOnJava:当Java版本满足指定条件时,才会装配或者配置;
@ConditionalOnCloudPlatform:当应用运行在指定的云平台上时,才会装配或者配置;
@ConditionalOnSingleCandidate:当容器中只存在一个候选bean时,才会装配或者配置;
@ConditionalOnClassCondition:自定义条件化装配。

这些注解可以通过多种组合使用,以实现更加复杂的条件化装配逻辑。

Conditional 可作用于方法或者类上

2.ConditionalOnMissingBean和ConditionalOnProperty应用

	@Bean(initMethod = "start", destroyMethod = "close")
	//代表spring中有该bean,就再执行该方法注入
    @ConditionalOnMissingBean
    //代表spring.profile.active= private 才注入该bean
    @ConditionalOnProperty(prefix = "spring.profile", name="active", havingValue = "private")
    public StrangeAdapter strangeAdapter() {
        System.out.println("556667777");
        StrangeAdapter strangeAdapter = new StrangeAdapter(strangeAppName, strangeAppSecurity, "default", strangeRegisterServer, apolloConfig, null);
        return strangeAdapter;
    }

3. ConditionalOnBean应用

@Component
@Slf4j
//代表spring中有MqttClientService的bean才加载注入NuwaMqttClient的bean
@ConditionalOnBean(MqttClientService.class)
或者 通过bean name进行判断加载
 @ConditionalOnBean(name = {"mqttClientService", "slaveDatasource"})
public class NuwaMqttClient {

    @Resource
    @Qualifier("mqttClientProxy")
    private MqttClientService mqttClient;

    @Resource
    private MqKafkaProducer mqKafkaProducer;
    ...
}

4. ConditionalOnMissingBean 应用

	@Bean
	//代表spring容器中没有masterSlaveDataSource 的bean时进行加载
    @ConditionalOnMissingBean(name = "masterSlaveDataSource")
    DataSource masterSlaveDataSource(TuYaDynamicDataSource masterDatasource, TuYaDynamicDataSource slaveDatasource) throws SQLException {
        MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration("masterSlaveDataSource",
                "masterDatasource", Arrays.asList("slaveDatasource"));

        Map<String, DataSource> result = new HashMap<>();
        result.put("masterDatasource", masterDatasource);
        result.put("slaveDatasource", slaveDatasource);

        Properties properties = new Properties();
        properties.setProperty("sql.show", "false");
        // sql执行线程数,为0表示无限制
        properties.setProperty("executor.size", "0");
        properties.setProperty("max.connections.size.per.query", "10");
        return MasterSlaveDataSourceFactory.createDataSource(result, masterSlaveRuleConfig, properties);
    }
5.ConditionalOnExpression应用
@Configuration
//上面的配置类使用了@ConditionalOnExpression注解,它的意思是只有当配置文件中的myapp.redis.enabled属性值为true时,才会创建RedisConfig配置类中的bean。
@ConditionalOnExpression("${myapp.redis.enabled:true}")
public class RedisConfig {

    @Bean
    public RedisTemplate redisTemplate() {
        return new RedisTemplate();
    }

}

2.非conditional家族根据配置加载

@Service(“lokiRedis”)
//当配置文件中spring.profiles.active = inner 时加载该bean
@Profile(value = {“inner”})
public class LokiRedisImpl implements RedisService {
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,@Conditional 和 @AutoConfigureAfter 是两个常用的注解,它们分别用于控制 Bean 的加载条件Bean 的加载顺序。下面分别对它们进行解析。 ## @Conditional @Conditional 注解用于控制 Bean 的加载条件,即只有满足指定的条件时,才会加载Bean。它的作用类似于 Spring Framework 中的 @Profile 注解,但更为灵活。 @Conditional 注解可以标注在配置类上或者 Bean 定义方法上,用于控制配置类或者 Bean 的加载条件。它的参数是一个实现了 Condition 接口的类,该类需要实现 matches 方法,用于指定 Bean 加载条件。 下面是一个使用 @Conditional 注解的例子: ```java @Configuration @Conditional(MyCondition.class) public class MyConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 这里,@Conditional(MyCondition.class) 指定了加载 MyConfig 配置类的条件,它的条件由 MyCondition 类中的 matches 方法指定。 ## @AutoConfigureAfter @AutoConfigureAfter 注解用于控制 Bean 的加载顺序,即指定在哪些 Bean 加载之后,才会加载当前 Bean。它的作用类似于 Spring Framework 中的 @DependsOn 注解,但更为灵活。 @AutoConfigureAfter 注解可以标注在配置类上或者 Bean 定义方法上,用于指定 Bean 加载顺序。它的参数是一个字符串数组,指定了当前 Bean 依赖的其他 Bean 名称。 下面是一个使用 @AutoConfigureAfter 注解的例子: ```java @Configuration @AutoConfigureAfter({MyConfig1.class, MyConfig2.class}) public class MyConfig3 { @Bean public MyBean3 myBean3() { return new MyBean3(); } } ``` 这里,@AutoConfigureAfter({MyConfig1.class, MyConfig2.class}) 指定了在 MyConfig1 和 MyConfig2 配置类加载之后,才会加载 MyConfig3 配置类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值