1 歷史上在spirng1版本,全都是使用xml配置,繁瑣,在jdk1.5之後java支持了註解,後來spring也開始使用註解,造成了db使用xml,業務service使用註解的統一習慣。在spring4之後,支持了java配置,springboot建議使用java配置,包括@Configuration(聲明當前是一個配置類,相似xml文件)和@Bean(用在方法上,說明返回一個bean)。springboot思想是「習慣優於配置」,內置了不少習慣性配置,即自動配置。同時提供了起步依賴,包含了多種基礎依賴包括spring-web,spring-mvc等等。java
總結起來,springboot的特色有二: 一是繼承starter,約定優於配置;二 自己是一些庫的集合,不是新的框架,無需管理各類庫。spring使編碼更簡單,配置更簡單,部署更簡單,監控更簡單。web
核心功能:spring
(1)獨立運行的spring項目,能夠打成jar包,java -jar就可運行。編程
(2)內嵌servlet容器,能夠選擇tomcat,jetty,undertow等,無需以war包形式部署。json
(3)提供starter,簡化mvn配置,pom能夠直接依賴spring-boot-starter-web,會自動引入多種依賴如hibernate,springmvc等。spring-mvc
(4)自動配置spring bean。會對類路徑下的jar包裏的類自動配置bean,極大減小配置。tomcat
(5)應用監控。基於http,ssh,telnet對項目進行運行時監控。springboot
(6)無代碼和xml配置。spring4.x提倡java配置和註解配置結合,所以spring-boot能夠實現不用spring-xml配置。session
spring-boot優勢 mvc
(1)快速構建項目。
(2)集成主流開發框架,無須額外配置(無需額外管理jar包和配置xml)。
(3)項目獨立運行,不需servlet容器(已經內置)。
* 默認tomcat,能夠換成jerry undertow,servlets filters listeners 均可以經過聲明爲bean來被容器註冊,還能夠配置相關屬性:server.port等。
(4)提供運行時監控。
(5)提升了開發部署效率。
(6)與雲計算結合。
*可使用idea的spring initializr和下面的web來建立項目,在新項目裏pom裏有父依賴spring-boot-starter-parent,規定了各類版本和基礎依賴。
* 項目提供了xxApplication做爲應用入口類,其中@SpringBootApplication是Sprnig Boot項目的核心註解,主要目的是開啓自動配置;main方法做爲程序入口;還能夠手動加上@RestController,至關於@Controller+@ResponseBody,讓類裏的方法都用json輸出。
* application.properties,這個文件用於配置全局變量。也支持自定義文件分別保存屬性。
2 springboot 經常使用模塊
(1)spring-boot 主庫,爲各模塊提供支持,SpringApplication類,提供main()方法直接啓動,嵌入web應用和容器(tomcat等)。
(2)spring-boot-autoconfigure 基於claspath下的內容配置通用的大部分模塊,@EnableAutoConfiguration 觸發spring上下文自動配置,自動配置可能須要的bean。自動配置優先級低於用戶本身定義的bean。
(3)spring-boot-starters 一組預約義的依賴,添加不一樣類型的應用功能。
(4)spring-boot-cli 能夠編譯和運行groovy源碼,提供極爲簡化的代碼開發。
(5)spring-boot-actuator 對應用系統集成監控功能,能夠查看配置和相關統計等。好比url訪問查看額外配置,查看bean配置,查看最近訪問的若干requet記錄等。
(6)spring-boot-loader 自定義的classloader,對打包文件格式進行了定義,容許構建可用java -jar執行的jar包。
3 基本配置
(1) xxApplication是應用入口類,@SpringBootApplication是核心註解,是一個組合註解以下。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
主要是@SpringBootConfiguration(裏面組合@Configuration) @EnableAutoConfiguration @ComponentScan
@Configuration 用@Configuration註解該類,等價 與XML中配置beans;用@Bean標註方法等價於XML中配置bean;但它們一樣能夠用在普通的spring項目中,而不是Spring Boot特有的,只是在spring用的時候,注意加上掃包配置。
@EnableAutoConfiguration 依賴springboot在類路徑中的查找,自動載入應用程序所須要的bean。@Enable***這種註解spring3.x就出現了,好比@EnableWebMvc,本質上經過@Import({DelegatingWebMvcConfiguration.class}) 來引入須要的bean。@EnableAutoConfiguration也使用import,
@Import({EnableAutoConfigurationImportSelector.class}),EnableAutoConfigurationImportSelector類使用了Spring Core包的SpringFactoriesLoader類的loadFactoryNamesof()方法, SpringFactoriesLoader會查詢META-INF/spring.factories文件中包含的JAR文件,spring.factories包含了自動配置列表。例如spring-boot-starter-tomcat引入了tomcat的依賴,因此EmbeddedServletContainerAutoConfiguration發現存在Tomcat.class就會注入TomcatEmbeddedServletContainerFactory來內置web容器。以下:
@Configuration
@ConditionalOnClass({Servlet.class, Tomcat.class})
@ConditionalOnMissingBean(
value = {EmbeddedServletContainerFactory.class},
search = SearchStrategy.CURRENT
)
public static class EmbeddedTomcat {
public EmbeddedTomcat() {
}
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory();
}
}
@ComponentScan 自動掃描@SpringBootConfiguration同級包以及包內的bean,因此建議入口類放在groupid+artificalid下面。
*能夠關閉特定的配置,使用exclude,例如@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
(2) application.properties,保存全局屬性,例如配置前綴端口啥的,支持yaml語言文件(後綴yml),例如正常版
server.port=8081
server.context-path=/test
若是用yaml語言,就是
server:
port:8081
context-path:/test
(3)spring boot starter是核心starter,包含自動配置、日誌和YAML。官方還有一些集成好的starter共44種,例如
spring-boot-starter-actuator 幫助監控和管理應用。
spring-boot-starter-aop 支持面向方面的編程即AOP,包括spring-aop和AspectJ。
spring-boot-starter-jetty 引入了Jetty HTTP引擎(用於替換Tomcat)。
*若是必定要讀取xml配置,例如 @ImportResource({"classpath:xxx.xml"})
3 自動注入的條件註解種類
@EnableAutoConfiguration定位到spring.factories文件,自動配置裏面的功能,自動配置列表裏的每一項都用了條件註解,好比上面例子的@ConditionalOnClass({Servlet.class, Tomcat.class}),在類路徑下有制定的類纔會進行配置。條件註解的種類包括如下等等:
@ConditionalOnBean 當容器裏有指定bean的狀況下
@ConditionalOnMissingBean 當容器裏沒有指定bean的狀況下
@ConditionalOnClass 當類路徑下(classpath)有指定的類的狀況下
@ConditionalOnMissingClass 當類路徑下沒有指定的類的狀況下
@ConditionalOnExpression 基於el表達式進行判斷
@ConditionalOnJava 基於jdk版本爲條件
@ConditionalOnWebApplication 當前項目是web項目的條件下
@ConditionalOnNotWebApplication 當前不是web項目的條件下
。。。。
以@ConditionalOnWebApplication 爲例,裏面依次判斷 GenericWebApplicationContext,是否有session的scope,環境是不是servlet環境等來判斷是否是web項目。
4 配置encoding範例
通常來講,想配置encoding過濾器,要在web.xml裏配置如下filter,配置encoding和forceEncoding,使用spring-boot也能夠配置filter。
在 application.properties裏面 配置參數 ,而後在配置類HttpEncodingProperties裏讀取。
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
再配置bean
@Configuration //至關於<beans>
@EnableConfigurationProperties(HttpEncodingProperties.class) //載入配置文件
@ConditionalOnClass(CharacterEncodingFilter.class) //CharacterEncodingFilter在類路徑下才觸發
@ConditionalOnProperty(prefix = "spring.http.encoding",value = "enabled",matchIfMissing = true) //默認enabled 爲true
public class HttpEncodingAutoConfiguration {
@Autowired
private HttpEncodingProperties httpEncodingProperties;
@Bean //至關於<bean>
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter(){
CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter();
characterEncodingFilter.setEncoding(httpEncodingProperties.getCharset().name());
characterEncodingFilter.setForceEncoding(httpEncodingProperties.isForce());
return characterEncodingFilter; } }