Spring Boot(三) spring-boot-starter

Spring Boot是Spring框架的約定優於配置的實現,提供開箱即用的實現,這些實現都以spring-boot-starter-作前綴命名,都位於org.springframework.boot包或者命名空間下css

配置方式有幾類:java

·命令行參數(Command Line Args)。mysql

·系統環境變量(Environment Variables)。
·位於文件系統中的配置文件。
·位於classpath中的配置文件。
·固化到代碼中的配置項。web

以上幾種方式按照優先級從高到低排列,高優先級方式提供的配置項能夠覆蓋或者優先生效,好比經過命令行參數傳入的配置項會覆蓋經過環境變量傳入的同一配置項,固然也會覆蓋其餘後面幾種方式給出的同一配置項。
不論是位於文件系統仍是classpath,SpringBoot應用默認的配置文件名叫做application.properties,能夠直接放在當前項目的根目錄下或者名稱爲config的子目錄下。redis

spring-boot-starter-loggingspring

默認用的logback,能夠更改成log4j和log4j2,在maven中聲明相似spring-boot-starter-log4j的依賴便可sql

spring-boot-starter-webmongodb

自動配置springmvc和tomcat,默認run會在8080端口啓動tomcat,並生成一個默認的錯誤頁面數據庫

能夠新建一個服務根路徑的web請求的controller實現:tomcat

@RestControllerpublic class IndexController { @RequestMapping("/") public String index() { return "hello, there"; }} 從新運行mvn spring-boot:run並訪問http://localhost:8080,錯誤頁面將被咱們的Controller返回的消息所替代,一個簡單的Web應用就這樣完成了。

  • web項目結構約定:

項目結構層面與傳統打包爲war的Java Web應用的差別在於,靜態文件和頁面模板的存放位置變了,原來是放在src/main/webapp目錄下的一系列資源,如今都統一放在src/main/resources相應子目錄下,好比:

1)src/main/resources/static用於存放各種靜態資源,好比css,js等。

2)src/main/resources/templates用於存放模板文件,好比*.vm。

默認是jar形式的打包,能夠改成war

  • SpringMVC框架約定:

spring-boot-starter-web默認將爲咱們自動配置以下一些SpringMVC必要組件:

·必要的ViewResolver,好比ContentNegotiatingViewResolver和Bean-NameViewResolver。

·將必要的Converter、GenericConverter和Formatter等bean註冊到IoC容器。

·添加一系列的HttpMessageConverter以便支持對Web請求和相應的類型轉換。

·自動配置和註冊MessageCodesResolver。

任什麼時候候,若是咱們對默認提供的SpringMVC組件設定不滿意,均可以在IoC容器中註冊新的同類型的bean定義來替換,或者直接提供一個基於WebMvcConfigurerAdapter類型的bean定義來定製,甚至直接提供一個標註了@EnableWebMvc的@Configuration配置類徹底接管全部SpringMVC的相關配置,本身徹底從新配置。

  • web容器約定

spring-boot-starter-web默認使用嵌入式tomcat做爲web容器對外提供HTTP服務,默認將使用8080端口對外監聽和提供服務:

1)假設咱們不想使用默認的嵌入式tomcat(spring-boot-starter-tomcat自動配置模塊),那麼能夠引入spring-boot-starter-jetty或者spring-boot-starter-undertow做爲替代方案。

2)假設咱們不想使用默認的8080端口,那麼咱們能夠經過更改配置項server.port使用本身指定的端口,好比:

server.port=9000 spring-boot-starter-web提供了不少以server.爲前綴的配置項用於對嵌入式Web容器提供配置,好比:

·server.port

·server.address

·server.ssl.*

·server.tomcat.*

若是這些依然沒法知足需求,SpringBoot甚至容許咱們直接對嵌入式的Web容器實例進行定製,這能夠經過向IoC容器中註冊一個EmbeddedServletContainerCustomizer類型的組件來對嵌入式Web容器進行定製:

public class UnveilSpringEmbeddedTomcatCustomizer implements Embed-dedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(9999); container.setContextPath("/unveil-spring-chapter3"); // ... }} 再深刻的定製則須要針對特定的嵌入式Web容器,使用實現對應的Factory並註冊到IoC容器:

·TomcatEmbeddedServletContainerFactory

·JettyEmbeddedServletContainerFactory

·UndertowEmbeddedServletContainerFactory

 

spring-boot-starter-jdbc

大部分Java應用都須要訪問數據庫,尤爲是服務層,因此,SpringBoot會爲咱們自動配置相應的數據訪問設施。

若想SpringBoot爲咱們自動配置數據訪問的基礎設施,那麼,咱們須要直接或者間接地依賴spring-jdbc,一旦spring-jdbc位於咱們SpringBoot應用的classpath,即會觸發數據訪問相關的自動配置行爲,最簡單的作法就是把spring-boot-starter-jdbc加爲應用的依賴。

默認狀況下,若是咱們沒有配置任何DataSource,那麼,SpringBoot會爲咱們自動配置一個基於嵌入式數據庫的DataSource,這種自動配置行爲其實很適合於測試場景,但對實際的開發幫助不大,基本上咱們會本身配置一個DataSource實例,或者經過自動配置模塊提供的配置參數對DataSource實例進行自定義的配置。

假設咱們的SpringBoot應用只依賴一個數據庫,那麼,使用DataSource自動配置模塊提供的配置參數是最方便的:

spring.datasource.url=jdbc:mysql://{database host}:3306/{databaseName}spring.datasource.username={database username}spring.datasource.password={database password} 固然,本身配置一個DataSource也是能夠的,SpringBoot也會智能地選擇咱們本身配置的這個DataSource實例(只不過必要性真不大)。

除了DataSource會自動配置,SpringBoot還會自動配置相應的JdbcTemplate、DataSourceTransactionManager等關聯「設施」,可謂服務周到,咱們只要在使用的地方注入就能夠了:

class SomeDao { @Autowired JdbcTemplate jdbcTemplate; public <T> List<T> queryForList(String sql){ // ... } // ...} 不過,spring-boot-starter-jdbc以及與其相關的自動配置也不老是帶來便利,在某些場景下,咱們可能會在一個應用中須要依賴和訪問多個數據庫,這個時候就會出現問題了。

假設咱們在ApplicationContext中配置了多個DataSource實例指向多個數據庫:

@Beanpublic DataSource dataSource1() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;}@Beanpublic DataSource dataSource2() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;} 那麼,很差意思,啓動SpringBoot應用的時候會拋出相似以下的異常(Exception):

Exception):No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2 爲了不這種狀況的發生,咱們須要在SpringBoot的啓動類上作點兒「手腳」:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})public class UnveilSpringChapter3Application { public static void main(String[] args) { SpringApplication.run(UnveilSpringChapter3Application.class, args); }} 也就是說,咱們須要在這種場景下排除掉對SpringBoot默認提供的DataSource相關的自動配置。

但若是咱們仍是想要享受SpringBoot提供的自動配置DataSource的機能,也能夠經過爲其中一個DataSource配置添加org.springframework.context.annotation.Primary這個Annotation的方式以實現一箭雙鵰:

@Bean@Primarypublic DataSource dataSource1() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;}@Beanpublic DataSource dataSource2() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;} 另外,SpringBoot還提供了不少其餘數據訪問相關的自動配置模塊,好比spring-boot-starter-data-jpa、spring-boot-starter-data-mongodb等,你們能夠根據本身數據訪問的具體場景選擇使用這些自動配置模塊。

警告 若是選擇了spring-boot-starter-data-jpa等關係數據庫相關的數據訪問自動配置模塊,而且還須要同時依賴訪問多個數據庫,那麼,也須要相應的在SpringBoot啓動類中排除掉這些自動配置模塊中的AutoConfiguration實現類(對應spring-boot-starter-data-jpa是JpaRepositoriesAutoConfiguration),或者標註某個DataSource爲@Primary。

spring-boot-starter-aop

現在,AOP(Aspect Oriented Programming)已經不是什麼嶄新的概念了,在經歷了代碼生成、動態代理、字節碼加強甚至靜態編譯等不一樣時代的洗禮以後,Java平臺上的AOP方案基本上已經以SpringAOP結合AspectJ的方式穩固下來(雖然你們依然能夠本身經過各類字節碼工具偶爾「打造一些輪子」)。

原則上來講,咱們只要引入Spring框架中AOP的相應依賴就能夠直接使用Spring的AOP支持了,不過,爲了進一步爲你們使用SpringAOP提供便利,SpringBoot仍是「不厭其煩」地爲咱們提供了一個spring-boot-starter-aop自動配置模塊。

spring-boot-starter-aop自動配置行爲由兩部份內容組成:

1)位於spring-boot-autoconfigure的org.springframework.boot.autoconfigure.aop.AopAutoConfiguration提供@Configuration配置類和相應的配置項。

2)spring-boot-starter-aop模塊自身提供了針對spring-aop、aspectjrt和aspectjweaver的依賴。

通常狀況下,只要項目依賴中加入了spring-boot-starter-aop,其實就會自動觸發AOP的關聯行爲,包括構建相應的AutoProxyCreator,將橫切關注點織入(Weave)相應的目標對象等,不過AopAutoConfiguration依然爲咱們提供了可憐的兩個配置項,用來有限地干預AOP相關配置:

·spring.aop.auto=true

·spring.aop.proxy-target-class=false

對咱們來講,這兩個配置項的最大意義在於:容許咱們投反對票,好比能夠選擇關閉自動的aop配置(spring.aop.auto=false),或者啓用針對class而不是interface級別的aop代理(aop proxy)。

spring-boot-starter-security

主要面向web安全,配合spring-boot-starter-web

默認提供一個基於HTTP的Basic認證,能夠對用戶密碼進行配置

security.user.name=xxx

security.user.password=xxx

還默認啓動一些web安全防禦,如XSS、CSRF等常見web攻擊

SpringSecurity框架包括了基本的認證和受權,也提供了加密解密,統一登陸等支持

AuthenticationManager/ AccessDecisionManager/ AbstractSecurityInterceptor是核心

AuthenticationManager管理身份認證,AccessDecisionManager控制放行,AbstractSecurityInterceptor是關卡的抽象

SpringSecurity基於Servlet規範,因此Play等不基於Servlet規範的框架沒法使用

有多個filter,總體有三類:信道與狀態管理、web安全防禦類,認證和受權類

默認的filter序列間隔步長爲10,因此能夠在中間自定義filter

spring-boot-starter-actuator

用於SpringBoot應用的監控。內部默認提供了不少endpoint。

「監」抽象爲Sensor類,「控」抽象爲Actuator類。每類都有不少內置的endpoint。

Sensor類包括autoconfig、beans、configprops、info、health、env、metrics、trace、mapping

Actuator類包括shutdown(慎用)、dump

建議使用的方式是所有禁用,而後按需開啓

health默認提供了數據源、磁盤空間、redis、solr、mongo等監控

相關文章
相關標籤/搜索