为什么要使用这个@profile注解。@profile注解是spring提供的一个用来标明当前运行环境的注解。我们正常开发的过程中经常遇到的问题是,开发环境是一套环境,qa测试是一套环境,线上部署又是一套环境。这样从开发到测试再到部署,会对程序中的配置修改多次,尤其是从qa到上线这个环节,让qa的也不敢保证改了哪个配置之后能不能在线上运行。
为了解决上面的问题,我们一般会使用一种方法,就是配置文件,然后通过不同的环境读取不同的配置文件,从而在不同的场景中跑我们的程序。
那么,spring中的@profile注解的作用就体现在这里。在spring使用DI来依赖注入的时候,能够根据当前制定的运行环境来注入相应的bean。最常见的就是使用不同的DataSource了。
下面详细的介绍一下,如何通过spring的@profile注解实现上面的功能。
主要有两种方式
一种是直接java里面使用注解完成
先创建javaBean(Datasource) (记得创建无参,有参构造方法和getter,setter方法)
public class Datasource {
private String url;
private String userName;
private String password;
然后是java配置类
@Configuration
//@ComponentScan(“com.sxt.pojo”)
public class Config {
@Bean
@Profile("dev")
public Datasource devDs(){
return new Datasource("http://dev:8080/","admin","admin");
}
@Bean
@Profile("pro")
public Datasource proDs(){
return new Datasource("http://pro:8083/","root","root");
}
}
然后测试
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
//设置使用哪种环境
ac.getEnvironment().setActiveProfiles(“dev”);
ac.register(Config.class);
ac.refresh();
Datasource ds = ac.getBean(Datasource.class);
System.out.println(ds);
}
以上是java方式的@profile注解的使用
xml配置方式的使用
同样需要Datasource这个实体类
public class Datasource {
private String url;
private String userName;
private String password;
然后需要创建spring的配置文件 ,取名为applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beans profile="dev">
<bean class="com.sxt.pojo.Datasource">
<property name="url" value="http://dev1:8080/" />
<property name="userName" value="admin" />
<property name="password" value="admin" />
</bean>
</beans>
<beans profile="pro">
<bean class="com.sxt.pojo.Datasource">
<property name="url" value="http:/pro1:8081/" />
<property name="userName" value="root" />
<property name ="password" value="root" />
</bean>
</beans>
然后测试
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//设置使用哪种环境
ac.getEnvironment().setActiveProfiles("dev");
ac.refresh();
Datasource ds = ac.getBean(Datasource.class);
System.out.println(ds);
}
注意java方式和xml方式初始化spring容器的方法是不同的
java的是创建AnntotionConfigApplication对象
通过该对象的register方法获取到java的配置类 Javaconfig
在通过getBean去获取profile注解设置的名字
xml的是实例化applicationContext ac = new ClassPathXmlApplicationContext(“applicationContext.xml”);
实例化过程中把配置文件传入 , 直接初始化spring容器 ,
然后再在通过getBean去获取profile注解设置的名字