Spring注解@Profile与@Conditional

本文介绍Spring框架中@Profile和@Conditional注解的使用方法。@Profile用于根据不同环境加载指定配置,如开发和生产环境;@Conditional则提供更灵活的条件判断,决定某个Bean是否创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring注解@Profile与@Conditional


1、@Profile注解

1.1、使用场景:

项目中使用多个数据库配置时,根据生产环境与测试环境的不同需要进行不同的配置,
如果每次都进行配置文件的修改,不方便也容易出错。
Spring为我们提供了@Profile注解实现加载指定的Bean实现简单的控制。

1.2、配置profile bean

1.2.1、注解方式

Spring3.2之后实现能够在方法级别上添加@Profile注解代码如下:

@Bean
@Profile("mysql_develop")
public DataSource druidDataSourceForMySQL() {
    DruidDataSource database = new DruidDataSource();
    database.setDriverClassName(environment.getProperty("jdbc.mysql.driverClassName"));
    database.setUrl(environment.getProperty("jdbc.mysql.url"));
    database.setUsername(environment.getProperty("jdbc.mysql.username"));
    database.setPassword(environment.getProperty("jdbc.mysql.password"));
    database.setDefaultAutoCommit(false);
    database.setTimeBetweenEvictionRunsMillis(3600000);
    database.setMinEvictableIdleTimeMillis(3600000);
    database.setInitialSize(1);
    return database;
}
1.2.2、配置文件方式
<beans profile="mysql_develop">
//待加载的bean
</beans>

1.3、激活 profile

激活profile的方式:在spring初始化加载的地方添加
'spring.profiles.active'或者
'spring.profiles.default'两个独立的属性。
通过读取profiles的值来激活指定value相同的@Profile注解下的Bean。
value值可以设置为多个之间用,隔开。

设置属性的方式:
1. applicationContext参数
2. 环境变量(添加到配置文件中)
3. DispatcherServlet初始化参数
4. 测试类中@ActiveProfiles注解上

例如:
在context中

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>mysql_develop,dev</param-value>
</context-param>

使用测试类时:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={PresistenceTestConfig.class})
@ActiveProfiles("dev")
public class Test {
  ...
}

在环境变量中
在加载的配置文件中添加:
spring.profiles.active=dev

2、@Conditional

2.1、使用场景

控制注解是否生效 例如:

@Conditional(SchedulingConfigCondition.class)
@PropertySource(value = {"classpath:task.properties"})
@Service("CreateESIndexTask.run")
@Lazy(false)

在SchedulingConfigCondition类上实现Condition接口,重写matches方法,matches方法返回值为true表示创建当前Bean,返回false表示不创建当前bean。
例子:

public class SchedulingConfigCondition implements Condition{

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

        return check( conditionContext,  annotatedTypeMetadata);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值