1. 怎麼動態改變spring的配置文件applicationContext.xml
既團森櫻然是ssh,那就需要在web.xml中配置一下
用listener
<context-param>塌叢
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/:applicationContext.xml,</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</春隱listener>
2. 怎麼在不重啟服務的情況下修改spring配置文件
我們有個項目要根據不同的注冊用戶,動態為這個用戶生成資料庫。所以就必須在系統中生成新的數據源,吵運這一切都要在不重啟服務的情況下完成。我現在是根據注冊的不同用戶,在spring的配置文件內添加數據源配置,可對spring的配置文件修改後不能得到相應源碰唯的內容。請問怎樣才能重新獲得修改過的配置文件?或者用別的方案來實現?
問題補充:謝謝你的幫助,按照你的雹培方案,問題已經解決。我根據不同的用戶產生相應的配置文件,然後對相應的用戶產生一個ApplicationContext放進Application池進行管理。這樣就是每個用戶都有一個獨立的ApplicationContext。
3. [轉載]Spring載入配置文件的幾種方法(org.springframework
("WebContent/WEB-INF/config/spring/web-application-config.xml"); 那麼在觸發action時會報錯: javax.servlet.ServletException: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [D:Program Filesapache-tomcat-6.0.26binWebContentWEB-INFconfigspringweb-application-config.xml]; nested exception is java.io.FileNotFoundException: WebContentWEB-INFconfigspringweb-application-config.xml (The system cannot find the path specified) 如果改為: ApplicationContext ctx=new
("WebContent/WEB-INF/config/spring/web-application-config.xml"); 又會報錯: javax.servlet.ServletException: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [WebContent/WEB-INF/config/spring/web-application-config.xml]; nested exception is java.io.FileNotFoundException: class path resource [WebContent/WEB-INF/config/spring/web-application-config.xml] cannot be opened because it does not exist 這是因為調用的是,而WebContent/WEB-INF/config/spring/web-application-config.xml並不在classespath路徑中。
4. 請教spring 配置文件問題
是的,這是個問題,理論上應該是從你從官方所下載版本的Spring, hibernate等框架的例子程序里復制的,肯定不是手動輸入的,否則很容易出錯。更好的方法是從這個項目的官方參考文檔里復制。
但是既然現在都是從各種各樣的教材里講的,你就從這些教材的常式里復制吧。
還有一個方法,MyEclipse的新版能迅枯夠添加Spring, struts2, hibernate支持的,這些工具會自動幫友滲你建立一個帶有空的畝告洞,但帶有這些抬頭的xml配置文件。
5. spring 配置文件問題
額,你是想通過get,set方式注入的啊,這方法不好吧。。
用spring註解吧 在Impl的類上加上@Repository 當然了也可以不加但一定要有實現類,
然後在配置中一開始加上包掃描<context:component-scan base-package="這里填上你的類所在的包名" />
6. springboot切換數據源時,保持舊數據源連接
Spring boot切換數據源時保持舊數據源連接,如果想要保持舊數據源連接,那麼只需要在切換數據源時褲咐再添加一個數據源胡賣純即可,這種情況下配攜能夠保持原來的舊的數據源的連接狀態或。
7. SpringMVC配置講解
轉發: SpringMVC默認就是以轉發的形式響應jsP,也就是說直接返回視圖名稱的方式就是轉銀搏發
重定向:需要使用 redirect: + 視圖路徑,當然也可以重定向到指定url再次進行處理,比如:redirect:/user/list
需要注意的是業務方法中,設置重定向不能像轉發一樣寫邏輯視圖,必須寫明目標資源的物理路徑,如"redirect:/index.jsp"
所以在springmvc配置文件中統一修改
真正的應用肯定少不了Spring,所以這里將spring配置加上
springmvc的上下文層級,理解層次化的 ApplicationContext
帶小s的 loaderlistener 所載入形成的上下文,可以有多個,為我們提供了所有應用公共所使用的組件和服務,如sevice、,這些服務應該被整個應用所共享,而不應該被局限在某個 dispatcherServlet 上下文之中
不帶小s的,就是與我們的 dispatcherServlet 相關的上下文。 dispatcherservlet 可以有多個,因為在現在的互聯網中,一個應用可能需要提供多兄飢種服務,而讓 dispatcherservlet 針對不同的服務請求去分發。因為有些服務是完全不同於其他服務的,所以需要作區分,根據配置的 url-pattern 進行攔截。
spring配置文件
該配置作用是注冊 RequestMappingHandlerMapping 與 RequestMappingHandlerAdapter 兩個Bean,這是Spring MVC為 @Controller 分發請求所必需的,並且提供了數據綁定支持, @NumberFormatannotation 支持, @DateTimeFormat 支持, @Valid 支持讀寫XML的支持(JAXB)和讀寫JSON的支持(默認Jackson)等功能
location:指location指定的目錄不要攔截,直接請求
mapping:指在static目錄下的所有文件(**代表所有文件)
cache-period:設置靜態資源在客戶端瀏覽鋒塵祥器中的緩存有效時間
該配置意思就是在根目錄下static的所有文件不會被 DispatcherServlet 攔截,直接訪問,當做靜態資源交給Servlet處理
可以配置多個ViewResolver。 使用order屬性排序。 InternalResourceViewResolver 需要放在最後。
如果想在方法中直接使用 HttpServletRequest 、 HttpServletResponse 、 HttpSession 等對象,需要引入servlet的依賴包
8. 如何使用多個Spring的xml配置文件
1, 在web.xml中定義 contextConfigLocation參數.spring會使用這個參數載入.所有逗號分割的xml.如果沒有這個參數,spring默認載入web-inf/applicationContext.xml文件.
[html] view plain
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:conf/spring/applicationContext_core*.xml,
classpath*:conf/spring/applicationContext_dict*.xml,
classpath*:conf/spring/applicationContext_hibernate.xml,
classpath*:conf/spring/applicationContext_staff*.xml,
classpath*:conf/spring/applicationContext_security.xml
classpath*:conf/spring/applicationContext_moles*.xml
classpath*:conf/spring/applicationContext_cti*.xml
classpath*:conf/spring/applicationContext_apm*.xml
</param-value>
</context-param>
contextConfigLocation 參數定義了要裝入的 Spring 配置文件。原理說明如下:
、利用ServletContextListener 實現。
Spring 提供ServletContextListener 的一個實現類ContextLoaderListener ,該類可以作
為listener 使用,它會在創建時自動查找WEB-INF/ 下的applicationContext.xrnl 文件。因
此,如果只有一個配置文件,並且文件名為applicationContext.xml ,則只需在web.xml
文件中增加如下代碼即可:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多個配置文件需要載入,則考慮使用<context-para即元素來確定配置文件的
文件名。由於ContextLoaderListener載入時,會查找名為contextConfigLocation的參數。
因此,配置context-param時參數名字應該是contextConfigLocation。
帶多個配置文件的web.xml 文件如下:
[html] view plain
<1-- XML 文件的文件頭二〉
<?xml version="l.O" encoding="工80-8859-1"?>
< 1-- web.xm1 文件的DTD 等信息一〉
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems. 工口c.//DTD Web Application 2.3//EN"
''http://java.sun.com/dtd/web-app_2_3.dtd''>
<web-app>
<!一確定多個配置文件>
<context-param>
<1-- 參數名為contextConfigLocation…〉
<param-name>contextConfigLocation</param-name>
<!一多個配置文件之間以,隔開二〉
<param-value>/WEB-工NF/Context.xml./WEB-INF/application
Context.xml</param-value>
</context-param>
<!-- 採用listener創建Applicat工onContext 實例-->
<listener>
<listener-class>org.spr工ngframework.web.context.ContextLoader
Listener</listener-class>
</listener>
</web-app>
如果沒有contextConfigLocation 指定配置文件,則Spring 自動查找application
Context. xrnl 配置文件。如果有contextConfigLocation,則利用該參數確定的配置文件。
該參數指定的一個字元串, Spring 的ContextLoaderListener 負責將該字元串分解成多個
配置文件,逗號","、空格" "及分號";"都可作為字元串的分割符。
如果既沒有applicationContext. xrnl 文件,也沒有使用contextConfigLocation參數確
定配置文件,或者contextConfigLocation確定的配置文件不存在。都將導致Spring 無法
載入配置文件或無法正常創建ApplicationContext 實例
配置一個spring為載入而設置的servlet可以達到同樣效果.
採用load-on-startup Servlet 實現。
Spring 提供了一個特殊的Servllet 類: ContextLoaderServlet。該Servlet 在啟動時,會
自動查找WEB-IN日下的applicationContext. xml 文件。
當然,為了讓ContextLoaderServlet 隨應用啟動而啟動,應將此Servlet 配置成
load-on-startup 的Servleto load-on-startup 的值小一點比較合適,因為要保證Application
Context 優先創建。如果只有一個配置文件,並且文件名為applicationContext. xml ,則在
web.xml 文件中增加如下代碼即可:
<servlet>
<servlet-name>context</servlet口-arne>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</
servlet-class>
<load-on-startup>l</load-o 口-startup>
</servlet>
。帶多個配置文件的web且nl 文件如下:
[html] view plain
<!-- XML 文件的文件頭-->
<?xml version="1.0" encoding="工SO-8859-1"?>
<! -- web.xml 文件的DTD 等信息→
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems , 工口c.//DTD Web Application 2.3//EN"
''http://java.sun.com/dtd/web-app_2_3.dtd''>
<web-app>
<'一確定多個配置文件一>
<context-param>
<!-- 參數名為contextConfigLocation-->
<param-name>contextConfigLocation</param-name>
<!-- 多個配置文件之間以,隔開一〉
<param-value>/WEB-工NF/Context.xml, !WEB-工NF/applicationContext.
xml</param-value>
</context-param>
<!一採用load-on-startup Servlet 創建Applicat工onContext 實例一〉
<servlet>
<servlet-narne>context</servlet-narne>
<servlet-class>org.springframework.web.context.ContextLoader
Servlet</servlet-class>
<!一下面值小一點比較合適,會優先載入一〉
<load-on-startup>l</load-on-startup>
</servlet>
</web-app>
2, 使用匹配符
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
比如說用到Hibernate,則把hibernate相關的配置放在
applicationContext-hibernate.xml這一個文件,而一些全局相關的信息則放在
applicationContext.xml,其他的配置類似.這樣就可以載入了,不必寫用空格或是逗號分開!
3, 如果使用struts載入多個spring配置文件.下面這個配置的其實也是contextConfigLocation變數.
struts-config.xml裡面加這個
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml,
/WEB-INF/action-servlet.xml,,,,,,,"/>
4,如果是非j2ee應用直接程序載入.
[java] view plain
ApplicationContext act = new (new String[]{"bean1.xml","bean2.xml"});
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
BeanFactory bf = (BeanFactory)reg;
9. spring中mysql多數據源切換 怎麼配置(配置文件)
由於項目需要,需要為我的springMCV項目配置mysql+oracle兩種數據源,運行時進行切換。由於技術水平有限,斷斷續續用了一周時間解決了這個小問題(比較懶),特來發篇博客,為以後需要的朋友提供參考。
首先,這個項目的多數據源配置建立在mysql已經搭建完成的基礎上,這部分的源代碼github上都有,網上也有不少教程,我就不作說明了,直接講如何配置oracle。
oracle我用的版本是11g,具體版本是11.2.0.1.0。下載及安裝,建表過程省略(詳情請網路,建表推薦用pl/sql)
我的項目中,資料庫的賬號密碼都是通過properties文件配置的,首先你需要配置好spring項目中的oracle的url,賬號以及密碼。
dataSource2.driver=oracle.jdbc.driver.OracleDriver
dataSource2.url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl
dataSource2.username=sys as sysdba
dataSource2.password=a123456
driver表示驅動名,username表示登錄oracle的用戶名,這里需要注意的是oracle非常注重資料庫管理員的許可權,因此在登錄時需要指明登錄者的身份,pl/sql以及navicat會讓你選擇以什麼角色登錄,而在spring項目中訪問時,直接輸入 用戶名 + as sysdba 的形式作為用戶名,密碼就是先前安裝oracle時設置的密碼。
接下來配置spring的配置文件,來配置2個數據源,我主要是參考了網上的文章,大致原理是為不同數據源配置不同的sqlSessionFactory以及sqlSessionTemplate,為項目編寫工具類,通過設置不同的鍵值切換數據源。
10. 二、springboot配置文件
1. 配置文件
Spring Boot使用一個全局的配置文件
application.properties
application.yml
配置文件的作用:修改Spring Boot自動配置的默認值,SpringBoot在底層都給我們自動
配置好。有什麼配置項,可以移步官方文檔
配置文件一般放在src/main/resources目錄或者類路徑/confifig下,當然還有很多位置可
以放,它們會有不同優先順序,後面會講到。
YAML (YAML Ain't Markup Language)
簡單介紹
<!--綁定配置文件處理器,配置文件進行綁定的時候就會有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 將應用打包成一個可執行Jar包,直接使用java -jar xxxx的命令來執行 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>以前的配置文件:大多是xml
.yml是YAML語言的文件,以數據為中 心,比json、xml等更適合做配置文件
全局配置文件的可以對一些默認配置值進行修改
配置實例
xml:
yml:
2. YAML語法
基本語法
K:(空格)V 標識一對鍵值對
以空格的縮進來控制層級關系
只要是左對齊的一列數據,都是同一層級的
屬性和值也是大小寫敏感
實例:
值的寫法
普通的值
k: v 字面量直接來寫,字元串默認不用添加單引號
" " 雙引號 不會轉義字元串裡面的特殊字元;
<server>
<port>8081</port>
</server>
server:
port: 8081
server:
port: 8081
path: /hello // 冒號後面的空格不要拉下' ' 單引號 會轉義字元,特殊字元最終是一個普通的字元串
對象
普通寫法:
行內寫法
frends:{ lastName: zhang,age: 18 }
Map
示例:
maps: {k1: v1,k2: v2}
數組
普通寫法:
pets: // var onj = {pets: ['cat','pig','dog']}
- cat
- pig
- dog
行內寫法
pets:[cat, pig, dog]
配置文件獲取
將配置文件中的每一個值映射到此組件中
1. Persion
name: "wang \n qian" // 輸出:wang 換行 qian
frends:
lastName: zhang
age: 20package com.wrq.boot.bean;
@Component
@ConfigurationProperties(prefix = "persion")
public class Persion {
private String name;
private int age;
private double weight;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!
}
@ConfifigurationProperties 意思是:我們類裡面的屬性和配置文件中的屬性做綁定
不使用此註解,可以在bean的屬性添加@value()註解,如下:
@Component
// @ConfigurationProperties(prefix = "persion")
public class Persion {
@value("${persion.name}") // $()讀取配置文件、環境變數中的值
private String name;
@value("#{11*2}") // #{SpEL} 採用表達式
private int age;
@value("true") // 直接賦值
private boolean boos;
}
此處採用@ConfifigurationProperties的方式,@value()和@ConfifigurationProperties的
區別見下方表格。prefifix = "persion" 配置文件中那個下面的屬性來一一映射
@Component 如果想要這個註解起作用,必須放到容器裡面
2. Dog
package com.wrq.boot.bean;
public class Dog { // 用作Persion中的屬性
private String name;
private int age;
此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!
}
3. 配置文件
方式一: application.yml
persion:
name: 王大錘
age: 18
weight: 125
boss: false
birth: 2018/5/5
maps: {k1: v1,k2: v2}
list:
- wangli
- wang
dog:
name: xiaogou
age: 2
方式二: application.propertiespersion.name = 王大錘
persion.age = 18
persion.weight = 125
persion.boss = false
persion.birth = 2018/5/5
persion.maps.k1 = v1
persion.maps.k2 = v2
persion.dog.name = xiaogou
persion.dog.age = 15
4. 測試類:BootApplicationTests
package com.wrq.boot;
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootApplicationTests {
@Autowired
Persion persion;
@Test
public void contextLoads() {
System.out.print(persion);
}
}
5. 運行 BootApplicationTests方法
控制台列印:
application.yml的結果:
Persion{name='王大錘', age=18, weight=125.0, boss=false, birth=Sat May
05 00:00:00 CST 2018, maps={k1=v1, k2=v2}, list=[wangli, wang],
dog=Dog{name='xiaogou', age=2}}
application.properties的結果:
Persion{name='��Ǭ', age=18, weight=125.0, boss=false, birth=Sat
May 05 00:00:00 CST 2018, maps={k2=v2, k1=v1}, list=[wangli, wang],
dog=Dog{name='xiaogou', age=15}}
把Bean中的屬性和配置文件綁定,通過yml文件和properties都可以做到,但是properties
文件出現亂碼。
properties中文讀取亂碼:File->Settings->File Encodings最底部選utf-8、Tranparent打
上勾
註解比較
@value和@ConfifigurationProperties獲取值比較
名詞解釋:
鬆散綁定
last-name和lastName都可以獲取導致,則代表支持鬆散綁定
JSR303@Component
@ConfigurationProperties(prefix = "persion") // 如果使用的是@value注入值
時,無法使用校驗
@Validated // 添加此註解
public class Persion {
@Email // 配置文件書寫的屬性必須是郵箱格式,不符合報錯!
private String name;
}
復雜類型封裝
如果獲取配置文件中map的值時,@value是獲取不到值的
@value("${persion.maps}") // 由於使用的是@value,無法獲取配置文件中的map
private Map<String,Object> maps;
@PropertySource
@PropertySource:載入指定配置文件
@ConfifigurationProperties()默認是從全局配置文件中獲取值,也就是
application.properties這個文件中獲取值。
如果做的配置很多,全局的配置文件就會特別大,為了方便管理。我會創建不同的配置文
件定向管理不同的配置。
如創建persion.properties文件單獨存放persion需要的配置
@PropertySource就是用來導入創建的配置文件
示例:
1. persion.properties
同時把兩個全局的配置中關於Persion的配置都注釋掉persion.name = 王弟弟
persion.age = 18
persion.weight = 125
persion.boss = false
persion.birth = 2018/5/5
persion.maps.k1 = v1
persion.maps.k2 = v2
persion.dog.name = xiaogou
persion.dog.age = 15
2. Persion
package com.wrq.boot.bean;
@Component
@PropertySource(value = {"classpath:persion.properties"})
@ConfigurationProperties(prefix = "persion")
public class Persion {
private String name;
private int age;
private double weight;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!
}
這樣運行測試類,控制台就可以列印persion.properties中的數據。
通過下面的註解,把類路徑下的persion.properties載入進來。並且把persion開頭的數
據進行綁定。
@PropertySource(value = {"classpath:persion.properties"})@ConfifigurationProperties(prefifix = "persion")
@ImportResource
@ImportResource:導入Spring的配置文件,讓配置文件生效。
示例:
1. com.wrq.boot.service
package com.wrq.boot.service;
/**
* Created by wangqian on 2019/1/12.
*/
public class HelloService {
}
2. resources目錄手動建立bean.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="com.wrq.boot.service.HelloService">
</bean>
</beans>
3. 測試類
package com.wrq.boot;
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootApplicationTests {
@Autowired
ApplicationContext ioc;@Test
public void testConfig() {
boolean b = ioc.containsBean("helloService");
System.out.print(b);
}
}
試圖通過添加一個Spring的配置文件bean.xml來把HelloService注入進去。
運行測試類結果:false
結果表明IoC容器中並不包含HelloService,即:配置文件bean.xml沒有生效
解決方式
方式一: 主程序中進行配置@ImportResouece註解
package com.wrq.boot;
@ImportResource(locations = {"classpath:bean.xml"}) // 通過此配置是
bean.xml生效
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
//應用啟動起來
SpringApplication.run(BootApplication.class, args);
}
}
方法二:通過配置類實現,這種方式也是Spring Boot推薦的
1. com.wrq.boot.confifigpackage com.wrq.boot.config;
/**
* Created by wangqian on 2019/1/12.
*/
@Configuration
public class MyConfig {
// 將方法的返回值添加到容器之中,並且容器中這個組件的id就是方法名
@Bean
public HelloService helloService(){
System.out.print("通過@Bean給容器添加組件了..");
return new HelloService();
}
}
@Confifiguration標注這是一個配置類
通過@Bean註解,將方法的返回值添加到容器之中,並且容器中這個組件的id就是方
法名
2. 把主程序類中@ImportResource()配置注釋掉
3. 測試成功,添加了HelloService()組件
3. 配置文件佔位符
隨機數
RandomValuePropertySource:配置文件中可以使用隨機數
${random.value}
${random.int}
${random.long}
${random.uuid}
${random.int(10)}
${random.int[1024,65536]}
屬性配置佔位符可以在配置文件中引用前面配置過的屬性(優先順序前面配置過的這里都能用)
${app.name:默認值}來指定找不到屬性時的默認值
persion.name = 王弟弟${random.uuid}
persion.age = ${random.int}
persion.dog.name = ${persion.name}_dog
4. Profifile 多環境支持
Profifile是Spring對不同環境提供不同配置功能的支持,可以通過激活、 指定參數等方式
快速切換環境
1. 多Profifile的方式
格式:application-{profifile}.properties/yml
application-dev.properties
application-prod.properties
默認採用application.properties配置文件,如果使用別的,需要激活:
1. application.properties中配置:
# 激活application-dev.properties配置文件
spring.profiles.active=dev
2. application-dev.properties:
server.port=8082
3. 運行BootApplication主程序:
2019-01-12 20:46:09.345 INFO 14404 --- [main]
s.b.c.e.t. : Tomcat started on port(s):
8082 (http)
2. 多文檔塊的方式
除了上方多Profifile的方式來切換環境,也可以通過YAML多文檔塊的方式。示例:
application.yml:
server:
port: 8081
spring:
profiles:
active: dev
---
spring:
profiles: dev
server:
port: 8083
---
spring:
profiles: prod
server:
port: 8084
3. 激活指定Profifile
1. application.properties中配置:
# 激活application-dev.properties配置文件
spring.profiles.active=dev
2. application.yml中配置
server:
port: 8081
spring:
profiles:
active: dev
---
spring:
profiles: dev
server:
port: 80833. 啟動配置-參數
在IDE中,類似於配置tomcat的地方,按下方配置:
Program arguments:--spring.profiles.active=dev
4. 啟動配置-虛擬機
在IDE中,類似於配置tomcat的地方,按下方配置:
VM options:-Dspring-profiles-active=dev
5. 命令行 使用Maven的package命令打包,移動到jar的目錄。
java -jar spring-boot-project-config.jar --spring.profiles.active=dev
5. 配置文件優先順序
GitHub對應項目:boot-confifig-position
優先順序
Spring Boot 啟動會掃描以下位置的application.properties或者 application.yml文件作
為Spring boot的默認配置文件
fifile:./confifig/ (項目根目錄confifig文件夾下的配置文件)
fifile:./ (項目根目下的配置文件)
classpath:/confifig/ (resources目錄confifig文件夾下的配置文件)
classpath:/ (resources目下的配置文件)
以上是按照優先順序從高到低的順序,所有位置的文件都會被載入,高優先順序配置內容會覆
蓋低優先順序配置內容,形成互補配置。
默認配置
我們也可以通過配置spring.confifig.location來改變默認配置。
項目打包後以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新
位置;指定配置文件和默認載入的這些配置文件共同起作用,形成互補配置。
1. Maven->package對項目打包2. 把待使用的配置文件放在本地文件夾中,如:D:/application.properties
3. 命令行執行命令
java -jar boot-config-position-xxxxxx.jar --
spring.config.location=D:/application.properties
這樣即使項目上線了,我們也可以通過修改本地的配置文件,使用一行命令即可,極大方
便了運維人員。
6. 外部配置載入順序
Spring Boot 支持多種外部配置方式
可以從以下位置載入配置,優先順序從高到低,高優先順序配置覆蓋低優先順序的,所以配置形
成互補配置。
1. 命令行參數
java -jar boot-config-position-xxxxxx.jar --server.port // 多個配置用空格
隔開
2. 來自java:comp/env的JNDI屬性
3. Java系統屬性(System.getProperties())
4. 操作系統環境變數
5. RandomValuePropertySource配置的random.*屬性值
6. jar包外部的application-{profifile}.properties或application.yml(帶spring.profifile)配
置文件
7. jar包內部的application-{profifile}.properties或application.yml(帶spring.profifile)配
置文件
8. jar包外部的application.properties或application.yml(不帶spring.profifile)配置文件
9. jar包內部的application.properties或application.yml(不帶spring.profifile)配置文件
10. @Confifiguration註解類上的@PropertySource
11. 通過SpringApplication.setDefaultProperties指定的默認屬性
注意:從jar包外向jar包內尋找,優先載入profifile最後載入不帶profifile,更多參考官方文
檔
7. 自動配置原理GitHub對應項目:boot-confifig-autoconfifig
1. 配置文件寫什麼?
配置文件可配置屬性查閱
2. 什麼是註解,如何實現一個註解?
關於註解的機制和相關原理可以移步此篇博客
3. 配置原理解析
我們運行Spring Boot應用是從main方法啟動,在主程序類上有一個
@SpringBootApplication註解。
@SpringBootApplication是一個復合註解,包括@ComponentScan,和
@SpringBootConfifiguration,@EnableAutoConfifiguration。
@SpringBootConfifiguration繼承自@Confifiguration,二者功能也一致,標注當前類
是配置類,並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例納入到
srping容器中,並且實例名就是方法名。
@EnableAutoConfifiguration的作用啟動自動的配置,@EnableAutoConfifiguration注
解的意思就是SpringBoot根據你添加的jar包來配置你項目的默認配置,比如根據
spring-boot-starter-web ,來判斷你的項目是否需要添加了webmvc和tomcat,就
會自動的幫你配置web項目中所需要的默認配置
@ComponentScan,掃描當前包及其子包下被@Component,@Controller,
@Service,@Repository註解標記的類並納入到spring容器中進行管理。是以前的co
ntext:component-scan(以前使用在xml中使用的標簽,用來掃描包配置的平行支
持)。
@SpringBootApplication註解分析
配置原理視頻講解
4. 自動配置類判斷
在配置文件properties中設置:debug=true 來讓控制台列印自動配置報告,方便的得知
那些配置類生效。
=========================
AUTO-CONFIGURATION REPORT
=========================Positive matches:
-----------------
matched:
- @ConditionalOnClass found required class
'org.springframework.web.servlet.DispatcherServlet';
@ConditionalOnMissingClass did not find unwanted class
(OnClassCondition)
- @ConditionalOnWebApplication (required) found 'session' scope
(OnWebApplicationCondition)
Negative matches:
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes
'javax.jms.ConnectionFactory',
'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)