@Profile注解与@Conditional注解

博客介绍了Spring的@Profile和@Conditional注解。@Profile可根据当前环境动态激活和切换组件,能指定组件在特定环境注册;@Conditional则按一定条件判断,满足条件就向容器注入bean,还给出了这两个注解的代码示例及测试结果。

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

@Profile注解:是spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能。

@Conditional:按照一定的条件进行判断,满足条件则给容器中注入bean

@Profile代码示例:

package common.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.util.StringValueResolver;

import javax.sql.DataSource;

@Configuration
@PropertySource("classpath:/dbconfig.properties")
public class MainConfigProfile implements EmbeddedValueResolverAware {
    @Value("${db.username}")
    private String userName;

    private StringValueResolver valueResolver;

    private String driver;

    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}")String pwd){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(userName);
        dataSource.setPassword(pwd);
        dataSource.setUrl("dbc:mysql://localhost:3306/dev");
        dataSource.setDriverClassName(driver);
        return dataSource;
    }

    @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}")String pwd){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(userName);
        dataSource.setPassword(pwd);
        dataSource.setUrl("dbc:mysql://localhost:3306/test");

        dataSource.setDriverClassName(driver);
        return dataSource;
    }

    @Profile("prod")
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}")String pwd){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(userName);
        dataSource.setPassword(pwd);
        dataSource.setUrl("dbc:mysql://localhost:3306/prod");
        dataSource.setDriverClassName(driver);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.valueResolver = resolver;
        driver = valueResolver.resolveStringValue("${db.driverClass}");
    }
}

测试类:

package common;

import common.config.MainConfigProfile;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ProFileTest {

    //1.使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test
    //2、代码的方式激活某种环境;
    @Test
    public void test(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigProfile.class);
//        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//        context.getEnvironment().setActiveProfiles("dev");
//        context.register(MainConfigProfile.class);
//        context.refresh();

        String[] names = context.getBeanDefinitionNames();
        for (String s: names){
            System.out.println(s);
        }
    }
}

测试结果的输出可以看出使用了@Profile注解后,可以指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境都能注册这个组件。

@Condition示例

配置类:

package common.config;

import common.bean.Red;
import common.bean.Yellow;
import condition.WindowsCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * @Conditional注解加在配置类上,不满足条件时,配置类都不会注入到容器中
 */
@Configuration
public class MainConfigCondition {

    @Bean
    public Red red(){
        return new Red();
    }
    @Conditional(WindowsCondition.class)
    @Bean
    public Yellow yellow(){
        return new Yellow();
    }
}

 

package condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        if(property.contains("Windows")){
            return false;
        }
        return true;
    }
}

测试类:

package common;

import common.config.MainConfigCondition;
import common.config.MainConfigProfile;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ProFileTest {

    @Test
    public void test(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigCondition.class);
        String[] names = context.getBeanDefinitionNames();
        for (String s: names){
            System.out.println(s);
        }
    }
}

测试结果:

八月 29, 2018 4:11:43 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a3046da: startup date [Wed Aug 29 16:11:43 CST 2018]; root of context hierarchy
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfigCondition
red

 

转载于:https://my.oschina.net/wuyiyi/blog/1936053

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值