通过实例了解Spring中@Profile的作用

时间:2021-05-19

这篇文章主要介绍了通过实例了解Spring中@Profile的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

根据系统环境的不同,Profile可以用来切换数据源。例如切换开发,测试,生产环境的数据源。

举个例子:

先创建配置类MainProfileConfig:

@Configuration@PropertySource("classpath:/jdbc.properties")public class MainProfileConfig implements EmbeddedValueResolverAware { @Value("${db.user}") private String user; private String driverClass; private StringValueResolver stringValueResolver; @Profile("test") @Bean("testDataSource") public DataSource getTestDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(pwd); comboPooledDataSource.setDriverClass(driverClass); return comboPooledDataSource; } @Profile("dev") @Bean("devDataSource") public DataSource getDevDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(pwd); comboPooledDataSource.setDriverClass(driverClass); return comboPooledDataSource; } @Profile("pro") @Bean("proDataSource") public DataSource getproDataSource(@Value("${db.password}") String pwd) throws PropertyVetoException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setUser(user); comboPooledDataSource.setPassword(pwd); comboPooledDataSource.setDriverClass(driverClass); return comboPooledDataSource; } @Override public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) { this.stringValueResolver = stringValueResolver; driverClass = stringValueResolver.resolveStringValue("${db.driverClass}"); }}

这里使用@Value和StringValueResolver来给属性赋值

测试:运行的时候设置环境 -Dspring.profiles.active=dev

public class ProFileTest { @Test public void test(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainProfileConfig.class); String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class); for (String name : beanNamesForType){ System.out.println(name); } applicationContext.close(); }}

打印输出:

devDataSource

也可以使用代码的方式设置系统环境,创建容器的时候使用无参构造方法,然后设置属性。

@Test public void test(){ //创建容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); //设置需要激活的环境 applicationContext.getEnvironment().setActiveProfiles("test"); //设置主配置类 applicationContext.register(MainProfileConfig.class); //启动刷新容器 applicationContext.refresh(); String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class); for (String name : beanNamesForType){ System.out.println(name); } applicationContext.close(); }

打印输出:

testDataSource

setActiveProfiles设置环境的时候可以传入多个值,它的方法可以接受多个参数。

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver { void setActiveProfiles(String... var1);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章