爲何要使用這個@profile註解。@profile註解是spring提供的一個用來標明當前運行環境的註解。咱們正常開發的過程當中常常遇到的問題是,開發環境是一套環境,qa測試是一套環境,線上部署又是一套環境。這樣從開發到測試再到部署,會對程序中的配置修改屢次,尤爲是從qa到上線這個環節,讓qa的也不敢保證改了哪一個配置以後能不能在線上運行。java
爲了解決上面的問題,咱們通常會使用一種方法,就是配置文件,而後經過不一樣的環境讀取不一樣的配置文件,從而在不一樣的場景中跑咱們的程序。spring
那麼,spring中的@profile註解的做用就體如今這裏。在spring使用DI來依賴注入的時候,可以根據當前制定的運行環境來注入相應的bean。最多見的就是使用不一樣的DataSource了。app
下面詳細的介紹一下,如何經過spring的@profile註解實現上面的功能。測試
主要有兩種方式url
一種是直接java裏面使用註解完成code
先建立javaBean(Datasource) (記得建立無參,有參構造方法和getter,setter方法)xml
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 xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <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> </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註解設置的名字