spring @Profile的运用示例
@Profile的作用是把一些meta-data进行分类,分成Active和InActive这两种状态,然后你可以选择在active 和在Inactive这两种状态 下配置bean,
在Inactive状态通常的注解有一个!操作符,通常写为:@Profile("!p"),这里的p是Profile的名字。
下面demo中AppProfileConfig的bean在active状态下被IOC容器创建,而AppProfileConfig2是在Inactive状态下被IOC容器创建:
demo的思路是:先定义两个domain类,再写两个配置类即上面提的AppProfileConfig和AppProfileConfig2这两个类,最后写一个测试类:
示例代码如下:
第一个domain类:Alarm类的代码如下:
package com.timo.profile.domain; public class Alarm { private String name; private Integer alarmSeverity; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAlarmSeverity() { return alarmSeverity; } public void setAlarmSeverity(Integer alarmSeverity) { this.alarmSeverity = alarmSeverity; } }
第二个domain类:ouyangfeng的代码如下:
package com.timo.profile.domain; public class Ouyangfeng { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
第一个配置类:AppProfileConfig的代码如下:
package com.timo.profile; import com.timo.profile.domain.Alarm; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @Profile("sixi") public class AppProfileConfig { @Bean public Alarm alarm(){ Alarm alarm = new Alarm(); alarm.setAlarmSeverity(1); alarm.setName("历史告警"); return alarm; } }
第二个配置类AppProfileConfig2的代码如下:
package com.timo.profile; import com.timo.profile.domain.Ouyangfeng; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @Profile("!flower") public class AppProfileConfig2 { @Bean public Ouyangfeng ouyangfeng(){ Ouyangfeng ouyangfeng = new Ouyangfeng(); ouyangfeng.setAge(25); ouyangfeng.setName("欧阳"); return ouyangfeng; } }
测试类的代码如下:
package com.timo.profile; import com.timo.profile.domain.Alarm; import com.timo.profile.domain.Ouyangfeng; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//激活@Profile中name为sixi的类: ctx.getEnvironment().setActiveProfiles("sixi"); ctx.register(AppProfileConfig.class,AppProfileConfig2.class); ctx.refresh(); Alarm alarm = ctx.getBean(Alarm.class); Ouyangfeng ouyangfeng = ctx.getBean(Ouyangfeng.class); System.out.println("alarm="+alarm); System.out.println("ouyangfeng="+ouyangfeng); } }