@Profile注解:是spring为咱们提供的能够根据当前环境,动态的激活和切换一系列组件的功能。java
@Conditional:按照必定的条件进行判断,知足条件则给容器中注入beanmysql
@Profile代码示例:spring
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}"); } }
测试类:sql
package common; import common.config.MainConfigProfile; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class ProFileTest { //1.使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test //二、代码的方式激活某种环境; @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注解后,能够指定组件在哪一个环境的状况下才能被注册到容器中,不指定,任何环境都能注册这个组件。ide
@Condition示例测试
配置类:ui
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; } }
测试类:this
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); } } }
测试结果:spa
八月 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