Spring Boot核心(基本配置)
上一篇Spring Boot我們簡單講了如何快速建立一個SpringBoot專案。大家都知道SpringBoot非常強大,可以輕鬆與各種工具整合,但是我們知其然,也必須知其所以然。今天開始就和大家一起學習一下SpringBoot核心,核心由於過於重要,需要分成好幾章,今天我們先來看看基本配置。
入口類和@SpringBootApplication
使用過或者瞄過一眼Spring Boot工程的小夥伴都知道, SpringBoot有一個特別顯著的特點, 就是每個SpringBoot工程都會有一個入口類, 在這個入口類上都會有這麼一個註解@SpringBootApplication。 這個類中有一個main方法,main方法中使用 SpringApplication.run(*Application.class,args), 用來啟動SpringBoot專案。如下所示:
public static void main(String[] args) {
SpringApplication.run(Createproject2Application.class, args);
}
@SpringBootApplication
@SpringBootApplication是Spring Boot的核心註解,
它是一個組合註解
(通常我們稱由多個註解組成的註解叫組合註解)。點進去瞧一眼
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication {
@SpringBootApplication註解主要(我這裡說了主要喔)組合了
@Configuration,@EnableAutoConfiguration,@ComponentScan
言外之意就是可以將這三個註解直接替換@SpringBootApplication
- @EnableAutoCOnfiguration讓Spring Boot根據類路徑中的jar包依賴為當前專案進行自動配置。例如添加了spring-boot-starter-web依賴,會自動新增Tomcat和Spring MVC的依賴,Spring Boot就會對Tomcat和Spring MVC進行自動配置。
2.@ComponentScan 讓Spring Boot去掃描與入口類同級以及以下包的Bean(使用註解配置的),把他們新增到Spring容器,若為JPA專案還可以掃描標註@Entity的實體類。
3.@Configuration 表示當前是一個配置類,也會被Spring進行載入
關閉特定的自動配置
SpringBoot為我們提供了自動化配置,但是在某些特定的場景下,
我們可能不需要某個自動配置,
這時可以在@SpringBootApplication中配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
定製Banner
什麼是Banner呢,
就是在Spring Boot專案啟動的時候最開始顯示的橫幅。
我記得我第一次啟動Spring Boot專案的時候印象最深的就是這個橫幅
內心不斷OS(wc這麼酷炫的嗎)。
下面我們看看怎麼自定義橫幅吧。如果不自定義,預設顯示下面圖案
修改Banner
- 我們在src/main/sources下新建一個banner.txt
- 登入http://patorjk.com/software/taag 生成我們自己想要的圖案
- 複製圖案到banner.txt中
- 啟動專案驗證
關閉banner
當然了,這個banner也不是必須要顯示的,我們可以手動關閉它。
修改啟動類中的main方法
SpringApplication app = new SpringApplication(Createproject2Application.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
Spring Boot的配置檔案
Spring Boot在src/main/resources下有一個全域性的配置檔案
application.properties或application.yml
說到yml這種配置檔案,是有點東西的。全稱為yaml,是以資料為中心,
支援多種資料格式(如陣列),在配置資料的時候具有面向物件的特徵。
簡單示例
在兩種配置檔案中配置Tomcat的埠號和預設的訪問路徑
- application.properties中可以如下配置:
server.port=8888
server.servlet.context-path=/xicent
- application.yml中可以如下配置:
server:
port: 8888
servlet:
context-path: /xicent
其實我們從簡單的例項中可以看出,yaml的格式更加清晰,所有配置看過去一目瞭然。並且它是有序的。
在以前idea中是不支援yml提示的,現在也都支援了。
但是yaml卻引來了另一個問題,yaml格式有嚴格的要求,稍有配錯都有可能出現問題。
因此在專案中看我們如何去取捨了,目前預設還是以properties為主。
使用xml配置
Spring Boot提倡的是0配置,即無xml配置,但是在實際開發中,
我們有時難免會需要載入xml配置,
這時我們就可以通過Spring提供的@ImportResource來載入xml配置
例如:
@ImportResource({"classpath:some-context.xml"})
這樣我們就成功載入xml配置啦。
命令列引數配置
在Spring Boot中,我們大部分配置都寫在了配置檔案中,
但是有些配置我們可能需要啟動時才能確定,
因此Spring Boot還提供了一種命令列配置方式
下面演示如何在執行jar包的時候,配置Tomcat的埠號
java -jar xx.jar --server.port=8888
常規屬性配置
在常規的Spring環境中,如果我們想載入某個properties檔案,
獲取其中的配置。通常的做法是在類上加註解@PropertiesSource()
指定配置檔案的位置。
然後在類中使用@Value()載入屬性。
在Spring Boot中,
我們只需在application.properties中定義屬性,
直接用@Value注入即可。
1.application.properties增加屬性
xicent.author=kris
xicent.age=1
2.修改入口類
@Value("${xicent.author}")
String name;
@Value("${xicent.age}")
int age;
@RequestMapping("/")
String index(){
return "author is"+name+",age is"+age;
}
獲取其他屬性
通用我們用@Value都是獲取properties配置檔案中配置的屬性,
但是@Value的功能可不遠遠不止這一點喔。
通過@Value註解,
我們還能獲取系統屬性,url,隨機數,文字流等等。
// 普通字串
@Value("xicent")
private String str;
// 作業系統名稱
@Value("#{systemProperties['os.name']}")
private String osName;
// 隨機數
@Value("#{T(java.lang.Math).random()*168.0}")
private double randomNumber;
// 其他bean的屬性
@Value("#{demoService.another}")
private String fromAnother;
// 獲取檔案資源
@Value("classpath:banner.txt")
private Resource file;
// 獲取地址資源
@Value("http://www.baidu.com")
private Resource url;
public void testValue() throws IOException {
System.out.println(getStr());
System.out.println(getOsName());
System.out.println(getRandomNumber());
System.out.println(getFromAnother());
System.out.println(IOUtils.toString(file.getInputStream(),"UTF-8"));
System.out.println(IOUtils.toString(url.getInputStream()));
}
//省略getter,setter方法
訪問介面
@RequestMapping("/testvalue")
void testValue() throws IOException {
xicentBean.testValue();
}
型別安全的配置(基於properties)
上面的例子,我們每個屬性都要使用@Value註解會顯得格外的麻煩,
我們配置的屬性通常會是許多個。
在Spring Boot中使用@ConfigurationProperties
將配置與bean相關聯,
這就是所謂的型別安全的配置。
這裡將配置配在一個專門的properties檔案中,
當然也能直接配置在application.properties中
1.resources資料夾下新增xicent.properties檔案,新增如下屬性
xicent.author=kris
xicent.age=1
2.建立一個類
@Component
@PropertySource("classpath:xicent.properties")
@ConfigurationProperties(prefix = "xicent")
public class XicentBean {
private String author;
private int age;
程式碼解釋:@PropertySource可以指定我們需要載入的檔案的路徑。@ConfigurationProperties指定我們屬性配置的字首
3.建立介面訪問
@Autowired
XicentBean xicentBean;
@RequestMapping("/xicent")
XicentBean getXicent(){
return xicentBean;
}
4.請求介面
Profile配置
Profile是Spring用來針對不同環境使用不同的配置檔案。
一般命名為:application-{profile}.properties
(如application-prod.properties)。
然後在application.properties中
設定spring.profiles.active=prod來指定活動的Profile。
下面演示生產環境(prod)使用8888埠,
開發環境(dev)使用9999埠
1.建立application-prod.properties,配置生產環境的埠
server.port=8888
2.建立application-dev.properties,配置開發環境的埠
server.port=9999
3.application.properties中指定生效的profile
spring.profiles.active=prod
4.啟動專案,可以看到prod配置檔案生效了,繫結埠為8888
疑問:如果我application.properties和application-prod.properties都配了埠,哪個會生效呢? 答案是prod的會生效
ok,今天就暫時分享這麼多啦,以上講的是Spring Boot中的基本配置,其中有很多地方都是可以深挖單獨拿出來講的。
今天這裡只講了一些基本的,比較常用的基本配置,後續我們還會再詳細分享。
喜歡的小夥伴可以關注公眾號:喜訊XiCent 有任何問題可以隨時問我喔