回目錄:JHipster一知半解
Spring Boot和程序入口
Spring Boot是由Pivotal團(tuán)隊(duì)提供的,用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過(guò)程的框架。該框架使用了基于注解加引用依賴來(lái)進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過(guò)這種方式,Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
Spring Boot核心就是能自動(dòng)根據(jù)所引入的依賴,智能判斷,智能生成對(duì)應(yīng)的Bean,項(xiàng)目中就能直接使用,起到簡(jiǎn)化配置,快速開發(fā)的目的。
Spring Boot內(nèi)容還是比較多的,不可能一一詳盡的說(shuō)明,下面僅選取一些JHipster的切入點(diǎn)進(jìn)行說(shuō)明:
1.Pom.xml相關(guān)部分
- 使用spring-boot作為整個(gè)maven項(xiàng)目的父工程
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>1.5.6.RELEASE</version>
<relativePath/>
</parent>
- 可以看出,主要依賴了acturator,data-jpa,security,starter-web,starter-thymeleaf幾個(gè),這里需要注意的是,有根據(jù)項(xiàng)目特點(diǎn),把可能沖突或者有無(wú)用的exclusion掉了,值得一提的是,把starter-tomcat去掉主要是由于JHipster的websocket使用的Undertow的,所以這里排除掉,然后在具體的dev里面再進(jìn)行指定。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
<exclusions>
<exclusion>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader-tools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
2.入口代碼JhipsterSampleApplicationNg2App
- 類注解:可以看到有3個(gè)注解
@ComponentScan
@EnableAutoConfiguration(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})
@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class})
由于@SpringBootApplication是組合了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,所以如果使用更spring-boot化的風(fēng)格前兩個(gè)也可以組合起來(lái)@SpringBootApplication(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})
- main()函數(shù)
這里調(diào)用了
DefaultProfileUtil.addDefaultProfile(app);,
也就是說(shuō),如果直接運(yùn)行和調(diào)試程序,實(shí)際上激活的profile是dev,在application.yml里面設(shè)置的spirng.profiles.acitve就不生效了,自動(dòng)運(yùn)行開發(fā)模式,當(dāng)然如果是用spring-boot的maven插件運(yùn)行,就不會(huì)進(jìn)入這塊代碼。這個(gè)小細(xì)節(jié)也算是使得開發(fā)和運(yùn)行更加方便。
3.maven的Profile與spring的profile
在查看項(xiàng)目的時(shí)候,發(fā)現(xiàn)maven本身有profile配置;同時(shí),spring 也有一個(gè)profile的概念。接觸時(shí)候就有點(diǎn)迷糊,這兩個(gè)是同一個(gè)東西,還是有所分工,之間又有什么什么關(guān)系呢。
- Maven Profile
定義:指定一系列的配置信息,規(guī)定動(dòng)作,然后指定激活條件。
激活:默認(rèn)在maven命令里,根據(jù)<id>標(biāo)簽激活,如-P dev即激活dev這個(gè)id的profile。其中有個(gè)<activeByDefault>作為不指定時(shí)的默認(rèn)值,JHipster的默認(rèn)就是dev。
具體的pom.xml中配置
- no-liquibase:僅增加no-liquibase,啟動(dòng)時(shí)liquibase不生效
swagger:配置swagger屬性,增加swagger功能(通常和dev同時(shí)生效) - webpack:使用eirslett的frontend-maven插件,使用maven去運(yùn)行node和yarn。相當(dāng)于:
run webpack:build:dev
- dev:使用undertow作為內(nèi)嵌web啟動(dòng),并增加spring-boot-devtools依賴。
- prod:對(duì)于前端,會(huì)先清空前端的target/www中代碼,然后和webpack一樣,調(diào)用yarns編譯;對(duì)于后端,用spring-boot插件的build-info進(jìn)行編譯。
- cc:使用scale maven插件進(jìn)行“實(shí)時(shí)編譯”
graphite:增加Graphite依賴,對(duì)spring-boot進(jìn)行外部監(jiān)控 - prometheus,增加Prometheus依賴,對(duì)spring-boot進(jìn)行外部監(jiān)控
IDE:mapstruct對(duì)IDE有額外的依賴,

- spring的profile選擇
spring通過(guò)@profile的注解標(biāo)明當(dāng)前運(yùn)行環(huán)境,實(shí)現(xiàn)在不同環(huán)境對(duì)Beans進(jìn)行更為精細(xì)的管理。
如:
@Profile(value = "dev")
@Component
public class ClassA { }
那么ClassA 就僅當(dāng)profile值未dev才被容器包含。
也就是說(shuō),maven用profile控制包含的文件,spring用profile控制包含的類,兩個(gè)合力就實(shí)現(xiàn)了不同用profile切換不同的環(huán)境。
4. 總結(jié)
總的來(lái)說(shuō),JHipster后端是一個(gè)標(biāo)準(zhǔn)的Spring-Boot應(yīng)用,并且使用maven(也可用gradle)進(jìn)行依賴管理、程序構(gòu)建。
5. 資源和書籍推薦
http://www.cnblogs.com/vipyoumay/p/8042924.html
spring boot實(shí)戰(zhàn)
http://www.voidcn.com/blog/liaokailin/article/p-2474233.html
Spring Boot 揭秘與實(shí)戰(zhàn)-工作原理剖析
http://blog.720ui.com/columns/springboot_all/
http://blog.720ui.com/columns/server_all/
SpringBoot非官方教程
http://blog.csdn.net/forezp/article/details/70341818
Spring Boot 視頻
http://412887952-qq-com.iteye.com/blog/2344171
Spring Boot 啟動(dòng)流程詳解
https://zhuanlan.zhihu.com/p/27320381
Maven中Profile
http://blog.csdn.net/mhmyqn/article/details/24501281
http://elim.iteye.com/blog/1900568
IDEA中Maven配置
https://www.jetbrains.com/help/idea/maven.html
Spring中的Profile
http://m.itdecent.cn/p/948c303b2253
http://elim.iteye.com/blog/2390557
http://elim.iteye.com/blog/2390567
另外,國(guó)人的三本書《SpringBoot揭秘:快速構(gòu)建微服務(wù)體系》、《Java EE開發(fā)的顛覆者 Spring Boot實(shí)戰(zhàn) 》,《深入實(shí)踐Spring Boot 》都比較入門,建議看看前面幾篇網(wǎng)文,看看源碼,斷點(diǎn)跟蹤一下一個(gè)具體的bean(如datasource,webContainer)的選擇,生成過(guò)程。