JHipster一知半解- 3.1Spring Boot和程序入口

回目录:JHipster一知半解

Spring Boot和程序入口

Spring Boot是由Pivotal团队提供的,用来简化新Spring应用的初始搭建以及开发过程的框架。该框架使用了基于注解加引用依赖来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring Boot核心就是能自动根据所引入的依赖,智能判断,智能生成对应的Bean,项目中就能直接使用,起到简化配置,快速开发的目的。
Spring Boot内容还是比较多的,不可能一一详尽的说明,下面仅选取一些JHipster的切入点进行说明:

1.Pom.xml相关部分

  1. 使用spring-boot作为整个maven项目的父工程
<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>1.5.6.RELEASE</version>
    <relativePath/>
</parent>
  1. 可以看出,主要依赖了acturator,data-jpa,security,starter-web,starter-thymeleaf几个,这里需要注意的是,有根据项目特点,把可能冲突或者有无用的exclusion掉了,值得一提的是,把starter-tomcat去掉主要是由于JHipster的websocket使用的Undertow的,所以这里排除掉,然后在具体的dev里面再进行指定。
<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

  1. 类注解:可以看到有3个注解
@ComponentScan
@EnableAutoConfiguration(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})
@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class})

由于@SpringBootApplication是组合了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,所以如果使用更spring-boot化的风格前两个也可以组合起来@SpringBootApplication(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})

  1. main()函数
    这里调用了
    DefaultProfileUtil.addDefaultProfile(app);,
    也就是说,如果直接运行和调试程序,实际上激活的profile是dev,在application.yml里面设置的spirng.profiles.acitve就不生效了,自动运行开发模式,当然如果是用spring-boot的maven插件运行,就不会进入这块代码。这个小细节也算是使得开发和运行更加方便。

3.maven的Profile与spring的profile

在查看项目的时候,发现maven本身有profile配置;同时,spring 也有一个profile的概念。接触时候就有点迷糊,这两个是同一个东西,还是有所分工,之间又有什么什么关系呢。

  1. Maven Profile

定义:指定一系列的配置信息,规定动作,然后指定激活条件。
激活:默认在maven命令里,根据<id>标签激活,如-P dev即激活dev这个id的profile。其中有个<activeByDefault>作为不指定时的默认值,JHipster的默认就是dev。
具体的pom.xml中配置

  • no-liquibase:仅增加no-liquibase,启动时liquibase不生效
    swagger:配置swagger属性,增加swagger功能(通常和dev同时生效)
  • webpack:使用eirslett的frontend-maven插件,使用maven去运行node和yarn。相当于:

run webpack:build:dev

  • dev:使用undertow作为内嵌web启动,并增加spring-boot-devtools依赖。
  • prod:对于前端,会先清空前端的target/www中代码,然后和webpack一样,调用yarns编译;对于后端,用spring-boot插件的build-info进行编译。
  • cc:使用scale maven插件进行“实时编译”
    graphite:增加Graphite依赖,对spring-boot进行外部监控
  • prometheus,增加Prometheus依赖,对spring-boot进行外部监控
    IDE:mapstruct对IDE有额外的依赖,
profile.png
  1. spring的profile选择
    spring通过@profile的注解标明当前运行环境,实现在不同环境对Beans进行更为精细的管理。
    如:
@Profile(value = "dev")  
@Component  
public class ClassA { }

那么ClassA 就仅当profile值未dev才被容器包含。
也就是说,maven用profile控制包含的文件,spring用profile控制包含的类,两个合力就实现了不同用profile切换不同的环境。

4. 总结

总的来说,JHipster后端是一个标准的Spring-Boot应用,并且使用maven(也可用gradle)进行依赖管理、程序构建。

5. 资源和书籍推荐

http://www.cnblogs.com/vipyoumay/p/8042924.html
spring boot实战
http://www.voidcn.com/blog/liaokailin/article/p-2474233.html

Spring Boot 揭秘与实战-工作原理剖析
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 启动流程详解
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://www.jianshu.com/p/948c303b2253
http://elim.iteye.com/blog/2390557
http://elim.iteye.com/blog/2390567

另外,国人的三本书《SpringBoot揭秘:快速构建微服务体系》、《Java EE开发的颠覆者 Spring Boot实战 》,《深入实践Spring Boot 》都比较入门,建议看看前面几篇网文,看看源码,断点跟踪一下一个具体的bean(如datasource,webContainer)的选择,生成过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容