Spring Boot——开发新一代Spring Java应用
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
Spring官方網(wǎng)站本身使用Spring框架開(kāi)發(fā),隨著功能以及業(yè)務(wù)邏輯的日益復(fù)雜,應(yīng)用伴隨著大量的XML配置文件以及復(fù)雜的Bean依賴關(guān)系。隨著Spring 3.0的發(fā)布,Spring IO團(tuán)隊(duì)逐漸開(kāi)始擺脫XML配置文件,并且在開(kāi)發(fā)過(guò)程中大量使用“約定優(yōu)先配置”(convention over configuration)的思想來(lái)擺脫Spring框架中各類繁復(fù)紛雜的配置(即時(shí)是Java Config)。
Spring Boot正是在這樣的一個(gè)背景下被抽象出來(lái)的開(kāi)發(fā)框架,它本身并不提供Spring框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開(kāi)發(fā)新一代基于Spring框架的應(yīng)用程序。也就是說(shuō),它并不是用來(lái)替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開(kāi)發(fā)者體驗(yàn)的工具。同時(shí)它集成了大量常用的第三方庫(kù)配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot應(yīng)用中這些第三方庫(kù)幾乎可以零配置的開(kāi)箱即用(out-of-the-box),大部分的Spring Boot應(yīng)用都只需要非常少量的配置代碼,開(kāi)發(fā)者能夠更加專注于業(yè)務(wù)邏輯。
Hello World
傳統(tǒng)基于Spring的Java Web應(yīng)用,需要配置web.xml, applicationContext.xml,將應(yīng)用打成war包放入應(yīng)用服務(wù)器(Tomcat, Jetty等)中并運(yùn)行。如果基于Spring Boot,這一切都將變得簡(jiǎn)單:
以Maven項(xiàng)目為例,首先引入Spring Boot的開(kāi)發(fā)依賴:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.2.5.RELEASE</version> </parent> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> </dependencies>編寫一個(gè)類包含處理HTTP請(qǐng)求的方法以及一個(gè)main()函數(shù):
@Controller @EnableAutoConfiguration public?class?SampleController?{@RequestMapping("/")@ResponseBodyString?home()?{return?"Hello?World!";}public?static?void?main(String[]?args)?throws?Exception?{SpringApplication.run(SampleController.class,?args);} }啟動(dòng)main函數(shù)后,在控制臺(tái)中可以發(fā)現(xiàn)啟動(dòng)了一個(gè)Tomcat容器,一個(gè)基于Spring MVC的應(yīng)用也同時(shí)啟動(dòng)起來(lái),這時(shí)訪問(wèn)http://localhost:8080就可以看到Hello World!出現(xiàn)在瀏覽器中了。
Spring Boot初探
在Maven依賴中引入了spring-boot-starter-web,它包含了Spring Boot預(yù)定義的一些Web開(kāi)發(fā)的常用依賴:
spring-web, spring-webmvc Spring WebMvc框架
tomcat-embed-* 內(nèi)嵌Tomcat容器
jackson 處理json數(shù)據(jù)
spring-* Spring框架
spring-boot-autoconfigure Spring Boot提供的自動(dòng)配置功能
Java代碼中沒(méi)有任何配置,和傳統(tǒng)的Spring應(yīng)用相比,多了兩個(gè)我們不認(rèn)識(shí)的符號(hào):
@EnableAutoConfiguration
SpringApplication
它們都是由Spring Boot框架提供。在SpringApplication.run()方法執(zhí)行后,Spring Boot的autoconfigure發(fā)現(xiàn)這是一個(gè)Web應(yīng)用(根據(jù)類路徑上的依賴確定),于是在內(nèi)嵌的Tomcat容器中啟動(dòng)了一個(gè)Spring的應(yīng)用上下文,并且監(jiān)聽(tīng)默認(rèn)的tcp端口8080(默認(rèn)約定)。同時(shí)在Spring Context中根據(jù)默認(rèn)的約定配置了Spring WebMvc:
Servlet容器默認(rèn)的Context路徑是/
DispatherServlet匹配的路徑(servlet-mapping中的url-patterns)是/*
@ComponentScan路徑被默認(rèn)設(shè)置為SampleController的同名package,也就是該package下的所有@Controller ,@Service , @Component, @Repository都會(huì)被實(shí)例化后并加入Spring Context中。
沒(méi)有一行配置代碼、也沒(méi)有web.xml。基于Spring Boot的應(yīng)用在大多數(shù)情況下都不需要我們?nèi)ワ@式地聲明各類配置,而是將最常用的默認(rèn)配置作為約定,在不聲明的情況下也能適應(yīng)大多數(shù)的開(kāi)發(fā)場(chǎng)景。
實(shí)例:數(shù)據(jù)庫(kù)訪問(wèn)
除了最基本的Web框架,另一種非常普遍的開(kāi)發(fā)場(chǎng)景是訪問(wèn)數(shù)據(jù)庫(kù)。在傳統(tǒng)的Spring應(yīng)用中,訪問(wèn)數(shù)據(jù)庫(kù)我們需要配置:
類路徑上添加數(shù)據(jù)庫(kù)訪問(wèn)驅(qū)動(dòng)
實(shí)例化DataSource對(duì)象,指定數(shù)據(jù)庫(kù)url, username, password等信息
注入JdbcTemplate對(duì)象,如果使用Hibernate,Mybatis等框架,還需要進(jìn)一步配置框架信息
在Spring Boot中,上述過(guò)程會(huì)被簡(jiǎn)化。首先在Maven項(xiàng)目依賴中定義:
spring-boot-starter-web-jdbc引入了spring-jdbc依賴,h2是一個(gè)內(nèi)存關(guān)系型數(shù)據(jù)庫(kù)。在引入了這些依賴并啟動(dòng)Spring Boot應(yīng)用程序后,autoconfigure發(fā)現(xiàn)spring-jdbc位于類路徑中,于是:
根據(jù)類路徑上的JDBC驅(qū)動(dòng)類型(這里是h2,預(yù)定義了derby, sqlite, mysql, oracle, sqlserver等等),創(chuàng)建一個(gè)DataSource連接池對(duì)象,本例中的h2是內(nèi)存數(shù)據(jù)庫(kù),無(wú)需任何配置,如果是mysql, oracle等類型的數(shù)據(jù)庫(kù)需要開(kāi)發(fā)者配置相關(guān)信息。
在Spring Context中創(chuàng)建一個(gè)JdbcTemplate對(duì)象(使用DataSource初始化)
接下來(lái)開(kāi)發(fā)者的工作就非常簡(jiǎn)單了,在業(yè)務(wù)邏輯中直接引入JdbcTemplate即可:
@Service public?class?MyService?{@AutowiredJdbcTemplate?jdbcTemplate; }除了spring-jdbc,Spring Boot還能夠支持JPA,以及各種NoSQL數(shù)據(jù)庫(kù)——包括MongoDB,Redis,全文索引工具elasticsearch, solr等等。
配置
Spring Boot最大的特色是“約定優(yōu)先配置”,大量的默認(rèn)配置對(duì)開(kāi)發(fā)者十分的友好。但是在實(shí)際的應(yīng)用開(kāi)發(fā)過(guò)程中,默認(rèn)配置不可能滿足所有場(chǎng)景,同時(shí)用戶也需要配置一些必須的配置項(xiàng)——例如數(shù)據(jù)庫(kù)連接信息。Spring Boot的配置系統(tǒng)能夠讓開(kāi)發(fā)者快速的覆蓋默認(rèn)約定,同時(shí)支持Properties配置文件和YAML配置文件兩種格式,默認(rèn)情況下Spring Boot加載類路徑上的application.properties或application.yml文件,例如:
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.DriverYAML格式更加簡(jiǎn)潔:
一旦發(fā)現(xiàn)這些信息,Spring Boot就會(huì)根據(jù)它們創(chuàng)建DataSource對(duì)象。另一個(gè)常見(jiàn)的配置場(chǎng)景是Web應(yīng)用服務(wù)器:
#?Server?settings?(ServerProperties) server:port:?8080address:?127.0.0.1sessionTimeout:?30contextPath:?/#?Tomcat?specificstomcat:accessLogEnabled:?falseprotocolHeader:?x-forwarded-protoremoteIpHeader:?x-forwarded-forbasedir:backgroundProcessorDelay:?30?#?secs通過(guò)port和address可以修改服務(wù)器監(jiān)聽(tīng)的地址和端口,sessionTimeout配置session過(guò)期時(shí)間(再也不用修改web.xml了,因?yàn)樗静淮嬖?#xff09;。同時(shí)如果在生產(chǎn)環(huán)境中使用內(nèi)嵌Tomcat,當(dāng)然希望能夠配置它的日志、線程池等信息,這些現(xiàn)在都可以通過(guò)Spring Boot的屬性文件配置,而不再需要再對(duì)生產(chǎn)環(huán)境中的Tomcat實(shí)例進(jìn)行單獨(dú)的配置管理了。
@EnableAutoCongiguration從Spring 3.0開(kāi)始,為了替代繁瑣的XML配置,引入了@Enable...注解對(duì)@Configuration類進(jìn)行修飾以達(dá)到和XML配置相同的效果。想必不少開(kāi)發(fā)者已經(jīng)使用過(guò)類似注解:
@EnableTransactionManagement開(kāi)啟Spring事務(wù)管理,相當(dāng)于XMl中的<tx:*> @EnableWebMvc使用Spring?MVC框架的一些默認(rèn)配置 @EnableScheduling會(huì)初始化一個(gè)Scheduler用于執(zhí)行定時(shí)任務(wù)和異步任務(wù)Spring Boot提供的@EnableAutoCongiguration似乎功能更加強(qiáng)大,一旦加上,上述所有的配置似乎都被包含進(jìn)來(lái)而無(wú)需開(kāi)發(fā)者顯式聲明。它究竟是如何做到的呢,先看看它的定義:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({?EnableAutoConfigurationImportSelector.class,AutoConfigurationPackages.Registrar.class?}) public?@interface?EnableAutoConfiguration?{/***?Exclude?specific?auto-configuration?classes?such?that?they?will?never?be?applied.*/Class<?>[]?exclude()?default?{}; } EnableAutoConfigurationImportSelector使用的是spring-core模塊中的SpringFactoriesLoader#loadFactoryNames()方法,它的作用是在類路徑上掃描META-INF/spring.factories文件中定義的類: #?Initializers org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer #?Auto?Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration實(shí)際上這就是Spring Boot會(huì)自動(dòng)配置的一些對(duì)象,例如前面提到的Web框架由EmbeddedServletContainerAutoConfiguration, DispatcherServletAutoConfiguration, ServerPropertiesAutoConfiguration等配置完成,而DataSource的自動(dòng)配置則是由DataSourceAutoConfiguration完成。現(xiàn)在我們以Mongo的配置MongoAutoConfiguration為例,來(lái)探索Spring Boot是如何完成這些配置的:
@Configuration @ConditionalOnClass(Mongo.class) @EnableConfigurationProperties(MongoProperties.class) public?class?MongoAutoConfiguration?{@Autowiredprivate?MongoProperties?properties;private?Mongo?mongo;@PreDestroypublic?void?close()?throws?UnknownHostException?{if?(this.mongo?!=?null)?{this.mongo.close();}}@Bean@ConditionalOnMissingBeanpublic?Mongo?mongo()?throws?UnknownHostException?{this.mongo?=?this.properties.createMongoClient();return?this.mongo;} }首先這是一個(gè)Spring的配置@Configuration,它定義了我們?cè)L問(wèn)Mongo需要的@Bean,如果這個(gè)@Configuration被Spring Context掃描到,那么Context中自然也就有兩個(gè)一個(gè)Mongo對(duì)象能夠直接為開(kāi)發(fā)者所用。
但是注意到其它幾個(gè)Spring注解:
@ConditionOnClass表明該@Configuration僅僅在一定條件下才會(huì)被加載,這里的條件是Mongo.class位于類路徑上 @EnableConfigurationProperties將Spring?Boot的配置文件(application.properties)中的spring.data.mongodb.*屬性映射為MongoProperties并注入到MongoAutoConfiguration中。 @ConditionalOnMissingBean說(shuō)明Spring?Boot僅僅在當(dāng)前上下文中不存在Mongo對(duì)象時(shí),才會(huì)實(shí)例化一個(gè)Bean。這個(gè)邏輯也體現(xiàn)了Spring?Boot的另外一個(gè)特性——自定義的Bean優(yōu)先于框架的默認(rèn)配置,我們?nèi)绻@式的在業(yè)務(wù)代碼中定義了一個(gè)Mongo對(duì)象,那么Spring?Boot就不再創(chuàng)建。 接下來(lái)看一看MongoProperties: @ConfigurationProperties(prefix?=?"spring.data.mongodb") public?class?MongoProperties?{private?String?host;private?int?port?=?DBPort.PORT;private?String?uri?=?"mongodb://localhost/test";private?String?database;//?...?getters/?setters?omitted }顯然,它就是以spring.data.mongodb作為前綴的屬性,然后通過(guò)名字直接映射為對(duì)象的屬性,同時(shí)還包含了一些默認(rèn)值。如果不配置,那么mongo.uri就是mongodb://localhost/test。
Production特性
從前面的例子可以看出,Spring Boot能夠非常快速的做出一些原型應(yīng)用,但是它同樣可以被用于生產(chǎn)環(huán)境。為了添加生產(chǎn)環(huán)境特性支持,需要在Maven依賴中引入:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>加入actuator依賴后,應(yīng)用啟動(dòng)后會(huì)創(chuàng)建一些基于Web的Endpoint:
/autoconfig,用來(lái)查看Spring?Boot的框架自動(dòng)配置信息,哪些被自動(dòng)配置,哪些沒(méi)有,原因是什么。 /beans,顯示應(yīng)用上下文的Bean列表 /dump,顯示線程dump信息 /health,應(yīng)用健康狀況檢查 /metrics /shutdown,?默認(rèn)沒(méi)有打開(kāi) /trace總結(jié)
Spring Boot是新一代Spring應(yīng)用的開(kāi)發(fā)框架,它能夠快速的進(jìn)行應(yīng)用開(kāi)發(fā),讓人忘記傳統(tǒng)的繁瑣配置,更加專注于業(yè)務(wù)邏輯。現(xiàn)在Spring官方文檔中所有的Guide中的例子都是使用Spring Boot進(jìn)行構(gòu)建,這也是一個(gè)學(xué)習(xí)Spring, Spring Boot非常好的地方。如果想進(jìn)一步深度學(xué)習(xí)Spring Boot,可以參考:
Spring Boot Reference
spring.io網(wǎng)站源碼
引用自:http://www.tianmaying.com/tutorial/spring-boot-overview?
轉(zhuǎn)載于:https://my.oschina.net/91jason/blog/644429
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Spring Boot——开发新一代Spring Java应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux对外连接端口数限制
- 下一篇: NodeJS学习笔记: RESTful