Boot提供的特色

一、导览

正文紧要按以下模块介绍spring Boot(1.3.6.RELEASE)提供的特征。

  1. SpringApplication类
  2. 外部化配置
  3. Profiles
  4. 日志
  5. 开发WEB应用
  6. Security
  7. 使用SQL
  8. 使用NoSQL
  9. 缓存
  10. 消息
  11. 发送邮件
  12. JTA处理分布式事务
  13. Spring Session
  14. 测试
  15. Actuator
  16. 部署

二、SpringApplication类

在主类——即含有@SpringBootApplication阐明类,的main方法里调用SpringApplication.run(应用的Configration配置类.class,参数列表)
会启动spring应用。默许log级别是INFO,会来得一些连锁的启航详情,比如启动应用的用户等。

1. 利用SpringApplicationBuilder类可以创制分层的 ApplicationContext

new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(Parent.class)
.child(Application.class)
.run(args);

2. Application事件和监听器

除却常用的Spring
framework事件,例如ContextRefreshed伊芙nt等,SpringApplication也会发送一些别样的采纳事件。 
有些事变在ApplicationContext被创设此前就被触发,因而不能将监听器注册为bean来监听。不过足以行使SpringApplication.addListeners(…)
或SpringApplicationBuilder.listeners(…)来注册监听器。也得以在META-INF/spring.factories文件定义监听器: 
org.springframework.context.ApplicationListener=com.example.project.MyListener 
运用运行时,应用事件发送顺序如下: 

在监听器和开始化器被先导化之后,任何其他应用之前,应用刚开头运行时会发送一个ApplicationStarted伊夫nt。 

在context被创立从前,context中要采纳的Environment被了然时,一个ApplicationEnvironmentPrepared伊夫(Eve)nt被发送。 

在bean定义被加载之后,refresh启动此前,一个ApplicationPrepared伊芙(Eve)nt被发送。 

在refresh以及任何有关的回调被拍卖未来,一个ApplicationReady伊夫nt被发送,评释应用已准备好服务requests。 
⑤ 启动时倘若暴发更加,一个ApplicationFailed伊芙(Eve)nt被发送。

3. web环境

SpringApplication会依据使用是否为web来创立不相同的ApplicationContext:
AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext。 
能够调用setWebEnvironment(boolean
webEnvironment)复写默许完毕(在junit测试时置为false最好),更可以应用setApplicationContextClass(…).完全控制ApplicationContext的创制。

4. 在SpringApplication.run完毕前执行一定代码

应用ApplicationRunner或CommandLineRunner,并同盟Order讲明指定调用顺序。 
CommandLineRunner的run(String
…args)方法直接访问SpringApplication.run传递的参数,ApplicationRunner的run方法则利用ApplicationArguments访问参数。例如:

import org.springframework.boot.*
import org.springframework.stereotype.*
@Component
public class MyBean implements CommandLineRunner {
public void run(String... args) {
// Do something...
}
}

三、外部化配置

1. 哪些引用配置的性能

可拔取properties文件,YAML文件,环境变量,命令行参数(如
–name=”fuck”)来外部化配置。属性值能够应用@Value表明直接流入到bean中,并由此Spring的Environment抽象或透过@
ConfigurationProperties 注明绑定到结构化对象来访问。 
示例: 
YAML文件: 
机械设备 1 
抑或千篇一律的properties文件: 
机械设备 2

运用@Value注入单个属性: 
机械设备 3

动用@ ConfigurationProperties注入属性族: 
机械设备 4 
※ 注意里面使用了JSR-303表明来校验属性值。

@ ConfigurationProperties还足以用到@Bean声明的主意上。 
机械设备 5

2. 性质加载顺序

Spring根据如下顺序设置properties: 
(一) 命令行参数。如:Java -jar
app.jar –name=”Spring” 
(二) SPRING_APPLICATION_JSON。如java
-Dspring.application.json=’{“foo”:”bar”, “hehe”:”fuck”}’ -jar
fuckapp.jar 
(三) 来自于java:comp/env的JNDI属性 
(四) Java System properties
(System.getProperties()). 
(五) OS环境变量 
(六) 只有在random.*里含有的属性会时有暴发一个RandomValuePropertySource 
(七) jar包外部的,由profile指定的application
properties文件(application-{profile}.properties或YAML文件) 
(八) jar包内部的,由profile指定的application
properties文件(application-{profile}.properties或YAML文件) 
(九) jar包外部的application
properties(application.properties和YAML)。 
(十) jar包内部的application
properties(application.properties和YAML)。 
(十一) @Configuration讲明类内部的@PropertySource表明 
(十二) 由SpringApplication.setDefaultProperties设置的默许属性

YAML是JSON的超集,卓殊适合定义层级化配置数据。引入SnakeYAML库会使SpringApplication类自动支持YAML。使用spring-boot-starter会自动引入YAML。

四、Profiles

Spring
Profiles提供了一种隔离应用程序配置的不二法门,并让那几个布置只可以在一定的条件下生效。

1. 哪些布置profile

任何@Component或@Configuration都能被@Profile标记,从而限制加载它的机遇。 
例如:

@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}

2. 怎么着在构建时指定profile

以正常的Spring格局,你可以利用一个spring.profiles.active的Environment属性来指定哪个配置生效。你可以运用平常的任 
何格局来指定该属性,例如,可以将它涵盖到你的application.properties中:

spring.profiles.active=dev,hsqldb

或利用命令行开关:

--spring.profiles.active=dev,hsqldb

2.1 添加激活的计划(profiles)

spring.profiles.active属性和其他性能一样都依照上文中涉及属性加载规则,优先级最高的PropertySource获胜。也就是说,你可以在application.properties中指定生效的配备,然后在命令行中设置同名属性的不等值来替换它们。

有些时候,将profile特定的特性扩展到active
profile中,而不是平素沟通会更有用。spring.profiles.include属性就可以用来无条件扩展active
profiles。SpringApplication类也提供api设置额外的profile(setAdditionalProfiles()) 
譬如说,根据上面的计划:

---
my.property: fromyamlfile
---
spring.profiles: prod
spring.profiles.include: proddb,prodmq

机械设备,借使接纳启动时打开选项–spring.profiles.active=prod,则proddb和prodmq也会被激活。

2.2 编程格局设置profile

在调用SpringApplication.run从前调用SpringApplication.setAdditionalProfiles(…)即可。已毕ConfigurableEnvironment接口也实惠。

2.3 profile特定的安顿文件

除外application.properties文件,profile特定的性能也能透过application-{profile}.properties来定义。Spring
boot提供了默许的application-default.properties文件,在并未定义任何profile时会加载。

profile特定的性能从跟标准application.properties相同的路径加载,并且特定profile文件会覆盖默许的布置。要是申明了接踵而至 蜂拥而至一个profile,则最后申明的被应用。

2.4 属性中的占位符(placeholders)

application.properties中的值会将由Environment过滤,所以您可以直接饮用此前定义的值:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

五、日志

Spring Boot内部日志使用康芒斯 Logging,但是付出底层日志完结。会为Java
Util Logging, Log4j,
Log4j2和Logback提供默许配置。不论哪类配备,loggers都被预配置为使用console输出,并提供一个可选的文本输出。

默许景况下,若是是应用’Starter POMs’,Logback将被用作日志落成。

1. Log 格式

Spring Boot默许的log格式如下:

2016-07-14 17:27:33.212  INFO 13092 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3832 ms
2016-07-14 17:27:33.668  WARN 13092 --- [ost-startStop-1] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote debug traffic on /.~~spring-boot!~/debug

体现以下内容:

  • 日期和岁月—飞秒精度,利于排序
  • Log级别—ERROR, WARN, INFO, DEBUG or TRACE.
  • PID.
  • 一个— 分隔符,表明实际log新闻的先导
  • 线程名—方括号中浮现(控制台出口时或许会被简单)
  • Logger名—一般是类名的缩写格式
  • log消息

2. 说了算台出口

默许,log音讯被形容输出到控制台,输出ERROR, WARN,
INFO级别。可以由此以入手段激活debug情势,输出更加多的新闻:

  • 在命令行使用 –debug 选项
  • 在application.properties中添加debug=true

敞开debug情势后,一些主导的loggers(如放置的servlet容器,hibernate和Spring)被计划输出越多的信息。

请注意 
此地开启的debug方式,并非将你利用的日记级别修改为DEBUG级别。

Spring
Boot输出日志到控制台时,会检测console是否帮助ansi,假设扶助,会展现彩色的日志。可以告一段落那种检测,或变更检测策略: 
将 spring.output.ansi.enabled 改为任何值即可(默许是detect)。

3. 文本输出

默许,Spring
Boot只输出日志到console。若是还想出口到文件,必要设置logging.file或logging.path属性。 
它们的咬合如下:

logging.file logging.path Example Description
  只输出到console
具体文件名 my.log console和日志文件。文件名还可以带路径
具体路径 /var/log console和路径下的spring.log。路径可绝对可相对

4. 日志级别

富有匡助的日志系统在Spring的Environment(例如在application.properties里)都可以通过’logging.level.*=LEVEL’(’LEVEL’是TRACE,
DEBUG, INFO, WARN,ERROR, FATAL, OFF中的一个)来安装日志级别。root
logger可以经过logging.level.root来布局。 
示例:application.properties

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

5. 自定义日志配置

将相应jar包放到信赖中,即可激活对应的日记框架。将日志的配置文件放到classpath的根目录下,或者放置logging.config指定路线下,就足以自定义日志的出口。

注意 
因为logging实在ApplicationContext被创设以前就开端化的,因而不能通过@Configuration声明类的@PropertySources来决定日志。而只好通过系统性能,环境变量和Spring
Boot的外部配置文件等来布署

与日志系统相呼应的公文会被活动加载:

日志系统 配置文件
logback logback-spring.xml, logback-spring.groovy, logback.xml,logback.groovy
Log4j log4j-spring.properties, log4j-spring.xml, log4j.properties,log4j.xml
Log4j2 log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging) logging.properties

注意 
引进应用-spring后缀的布局文件,例如logback-spring.xml,而非logback.xml。否则Spring可能无法完全控制log的伊始化。

注意 
Java Util Logging可能会造成类加载问题,不推荐使用。

6. Logback扩展

Spring
Boot为Logback提供了部分尖端配置属性。可以在logback-spring.xml中采取。

注意 
无法再logback.xml中动用,因为此文件加载的太早。要么在logback-spring.xml中拔取,要么定义logging.confi属性。

6.1 Profile特定的安插

<springProfile> 标签允许你按照Spring
profiles参加或者解除有些配备。 
例如:

<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev, staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

6.2 Environment属性

<springProperty> 标签允许你在logback配置文件中运用Spring
Environment的性能。那足以让你在logback配置中动用application.properties中的值。 
例如:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}</remoteHost>
...
</appender>

六、开发web应用

Spring
Boot十分适合开发web应用。你可以行使内嵌的汤姆cat,Jetty或Undertow轻松创建一个HTTP服务器。半数以上的web应用都选取spring-boot-starter-web模块进行高效搭建和运行。

1. Spring MVC

Spring Web MVC框架是一个富”模型,视图,控制器”的web框架。
允许你成立特定的@Controller或@RestController beans来处理传入的HTTP请求。
使用@RequestMapping注脚可以将控制器中的方法映射到相应的HTTP请求。 
Spring Boot为MVC提供了如自行配置,模板引擎等许多特点。

1.1 自动配置

Sprint boot为mvc扩充如下自动配置:

  • 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。 

    ContentNegotiatingViewResolver是ViewResolver的一种完成,其基于请求的media
    type来为呼吁拔取一个适当的View。请求的mediatype由ContentNegotiationManager决定。一旦请求的media
    type被决定,那几个resolver查询所有的view
    resolver,并赶回最匹配的。可以指定ContentNegotiatingViewResolver
    的defaultViews属性,在mediatype匹配时将选拔此defaultViews指定的viewResolver。 
    比如说,一个/view.html的伸手会去寻找content
    type为text/html的viewresolver;一个途径为/view,并且header中Accept为text/html的央浼也同理。 
    ② BeanNameViewResolver也是一种viewresolver,简单的将view
    name解释成bean 
    name。如controller中返回”view”,会去找id为view的bean。

  • 对静态资源的支撑,包涵对WebJars的匡助。

  • 电动注册Converter,GenericConverter,Formatter beans 
    Converter<S,T>用来将S转换成T

  • 对HttpMessageConverters的支持。 
    可将目的转换成Http request/response,或者相反。Spring
    MVC中,object可以自动转换成Json(杰克逊库)或XML(杰克逊xml或者jaxb)。String使用utf-8编码。

  • 电动注册MessageCodesResolver。

  • 对静态index.html的支持。

  • 对自定义Favicon的辅助。

  • ConfigurableWebBindingInitializer bean的电动使用。


若要完全掌控springmvc,应丰盛自己的@Configuration和@EnableWebMVC注明的类。若想保留Spring
boot mvc的特点,同时添加额外的mvc配置(如拦截器,formatters,view
controllers等),你可以增加自己的WebMvcConfigurerAdapter类型的@Bean(不行使@EnableWebMVC申明)。

1.2 静态内容

默许意况下,Spring
Boot从classpath的/static(/public,/resources或/META-INF/resources)的文本夹或从ServletContext根目录提供静态内容。 
那使用了Spring
MVC的ResourceHttpRequestHandler,所以您可以透过抬高自己的WebMvcConfigurerAdapter并覆写addResourceHandlers方法来改变这么些行为(加载静态文件)。 
假使你的施用将被打包成jar,那就无须选取src/main/webapp文件夹。即便该公文夹是一个一同的业内,但它仅在包装成war的情事下起效率,并且只要暴发一个jar,多数构建工具都会沉寂的忽视它。

1.3 模板引擎

Spring boot帮助以下模板引擎的自发性配置:freemarker, groovy, thymeleaf,
velocity, mustache。 
Boot自动从src/main/resources/templates中找找模板。 
采纳内置servlet容器时要幸免使用jsp,原因如下:

  • 置于tomcat不援助实施jar里的jsp。
  • Jetty在jsp时不协助内置容器个格式。
  • Undertow不支持jsp。

1.4 Error Handling

Spring
Boot默许提供一个/error映射用来以适量的艺术处理所有的不当,并且它在servlet容器中注册了一个大局的
错误页面。 
想要完全替换默许行为,可以兑现ErrorController接口,或者落成BasicErrorController类,由自定义的Controller处理错误。 
也得以通过@Contorller艾达(Ada)vice注明+@ExceptionHandler声明定制某个controller或exception种类要回来的JSON文档。如:

@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}

2. 嵌入的servlet容器

Spring Boot支持内嵌的汤姆(Tom)cat,
Jetty和Undertow服务器。多数开发者只须要选取方便的’Starter
POM’来得到一个通通配置好的实例即可。默许意况下,内嵌的服务器会在8080端口监听HTTP请求。

2.1 将Servlets, filters, listeners注册为bean

具有定义为bean的servlets,filters,listeners都将被停放的容器注册。假如只有一个servlet,它将被map到/,否则bean的名字会作为path前缀。Filters都将map到/*。 
也可以运用ServletRegistrationBean,FilterRegistrationBean and
ServletListenerRegistrationBean更完整的决定。

2.2 通过评释扫描servlet, filter listener

使用嵌入式容器时,要兑现@WebServlet,@WebFilter,
@Weblistener的电动注册,需要选择@ServletComponentScan。使用独立容器时此注明无用。

2.3 Servlet Context 初始化

置于的servlet容器不会向来实施Servlet3.0+的javax.servlet.ServletContainerInitializer接口,或者Spring的
org.springframework.web.WebApplicationInitializer接口。那是为了幸免有些被规划为运行在war内的第三方库会损坏sprint
boot应用。独立httpserver下完结WebApplicationInitializer即可在代码中配备ServletContext,代替web.xml。 
若需要在spring boot应用中展开servlet context
伊始化,你应该登记一个贯彻了org.springframework.boot.context.embedded.ServletContextInitializer接口。

2.4 EmbeddedWebApplicationContext

该类是一种特有的WebApplicationContext,启动时会寻找一个EmbeddedServletContainerFactory,例如汤姆catEmbeddedServletContainerFactory,
JettyEmbeddedServletContainerFactory, or
UndertowEmbeddedServletContainerFactory。Spring boot会自动配置这个。

2.5 配置嵌入式servlet容器

2.5.1 可以在如application.properties文件中配置servlet容器所用的属性

包括:

  • server.port:http监听端口
  • server.address: 要绑定的接口地址
  • server.session.persistence: session持久化
  • server.session.timeout:session超时时间
  • server.session.store-dir:session数据的location
  • server.session.cookie.*: session-cookie配置。
  • server.error.path:error page的地址
  • server.ssl.key-store, server.ssl.key-store-password,
    server.ssl.key-password: ssl的配置
  • server.compression.enabled: http response压缩
  • server.compression.min-response-size:压缩所需的小不点儿size,默认时2048字节
  • server.compression.mime-types:要减弱的response content
    类型。默认时text/html, text/xml, text/plain, text/css

2.5.2 也可透过已毕EmbeddedServletContainerCustomizer接口在代码中修改属性

2.5.3 也可一向促成汤姆catEmbeddedServletContainerFactory bean来陈设

七、Security

1. 启用Security

当spring security在classpath中(即引入spring-boot-starter-security
pom),web应用将自动启用安全范围,并且默许启用basic认证。 
也可经过@EnableGlobalMethodSecurity注明添加方式级其他安全范围。

2. 配置Security

默许的AuthenticationManager有一个用户,名为user,
密码会打印在log中,也可安装security.user.password属性修改密码。 
默许的security配置由SecurityAutoConfiguration配置类及其导入的配置类(SpringBootWebSecurityConfiguration配置web
security,
AuthenticationManagerConfiguration配置认证,此类在非web应用也适用)完结。 
若要完全关闭默许的web
security配置,可以添加一个涵盖@EnableWebSecurity的bean,这样并不会关闭authentication
manager配置。

@EnableWebSecurity表明使用格局 
将此声明添加到含有@Configuration申明,并且落成了WebSecurityConfigurer接口或一而再WebSecurityConfigurer艾达pter类的类方面,即可用此类替代xml设置web 
security。同时还可将配置内容放到外部属性文件中。

若也想关闭authentication
manager配置,你可以增添一个AuthenticationManager的bean,或者通过将AuthenticationManagerBuilder注入到@Configuration类的一个措施中来安排全局的AuthenticationManager。

3. Security带来的风味

Web应用中行使Spring Security未来,你可以收获如下基本特色:

  • 一个带有in-memory
    store的AuthenticationManager,和一个user(查看SecurityProperties.User获取user的性能)。
  • 通用静态资源路径不会被安全限制:css/, /js/, \
    and **/favicon.ico
  • 任何部分都会使用Http Basic安全保安。
  • 安全事件都会被宣布到spring的Application伊夫(Eve)ntPublisher(包罗讲明成功,认证失利以及拒绝访问等)
  • Spring Security提供的大规模底层特性(HSTS, XSS, CSRF,
    缓存)默许都被拉开。

HSTS是什么 
HTTP Strict Transport
Security,HTTP严刻传输安全。HSTS的法力是威迫客户端(如浏览器)使用HTTPS与服务器创制连接。服务器开启HSTS的法子是,当客户端通过HTTPS发出请求时,在服务器重回的超文本传输协议响应头中包括Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。 
参考: http://www.chinaz.com/program/2015/0511/405146.shtml

不无方面的配备都得以透过外部属性文件修改。想要在不更改任何其余机关配置特点的前提下覆盖访问规则,可以追加一个WebSecurityConfigurer艾达pter类型的bean。

设若打开了spring-boot-actuator,会有如下特点: 

– 固然选拔路径不受珍爱,被管理的门道也会境遇有限支持。 

有惊无险荣辱与共的轩然大波被转移为奥迪t伊芙nts(审计事件),并揭橥给奥迪(Audi)t瑟维斯(Service)(Service)。 

  • 默许的用户有ADMIN和USER的角色。 
    动用外部属性可以修改Actuator(执行器)的平安特点(management.security.*)。为了掩盖应用程序的拜访规则,你可以添加一个WebSecurityConfigurer艾达(Ada)pter类型的@Bean。同时,若是不想覆盖执行器的拜会规则,你可以行使@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)申明该bean,否则使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)注解该bean。

八、使用SQL数据库

Spring Boot项目引入spring-boot-starter-data-jpa等即可使用Spring
Data与DB交互。除了spring框架提供的JdbcTemplate以及ORM,Spring
Data还提供了别样级其余法力,如成立Repository接口的贯彻,然后按照方法名爆发queries。

1. 布局数据源

Java的javax.sql.DataSource接口提供了一个专业的施用数据库一而再的不二法门。传统做法是,一个DataSource使用一个URL和用户名/密码去先导化一个数据库连接。

1.1 内嵌数据库

Spring boot襄助活动配置二种in-memory的嵌入式DB:H2, HSQL,Derby。 
不必提供URL,引入如下依赖即可使用。例如,典型的pom如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>

 

上文能够使Spring Boot自动为运用配置in-memory的hsqldb数据库,并确立连接。

1.2 连接到一个生育环境数据库

在生育条件中,数据库连接可以选取DataSource池进行机动配置。Spring
boot自动配置DataSource池时的选拔顺序如下:

  • 鉴于汤姆(Tom)cat数据源连接池的性能和出现,在tomcat可用时,大家连年优先选用它。
  • 倘若HikariCP可用,大家将拔取它。
  • 假如康芒斯 DBCP可用,大家将使用它,但在生产环境不推荐使用它。
  • 最后,如若康芒斯 DBCP2可用,大家将运用它。

万一利用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa
‘starter POMs’,你将会自行获取对tomcat-jdbc的借助。 
若要修改默许的数额源类型,或者指定其余的多少源类型,能够在application.properties中指定。 
例如:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=xxxxxHikariCP

注:使用MySQL时要追加mysql
connector的依靠。

2. 使用JdbcTemplate

Spring的JdbcTemplate和NamedParameterJdbcTemplate类将被活动配置,你可以在投机的beans中通过@Autowire直接注入它们。 
例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final JdbcTemplate jdbcTemplate;
@Autowired
public MyBean(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// ...
}

3. JPA和Spring Data

Spring-boot-starter-data-jpa提供如下依赖:

  • Hibernate
  • Spring Data JPA
  • Spring ORMs

3.1 Entity类

传统上,JPA实体要求在persistence.xml中宣称。Spring
boot中无需那样,它可以活动搜索Entity。 
默许在主配置类(标记有@EnableAutoConfiguration 或者
@SpringBootApplication)下的有所包会被寻找,并且会招来带有@Entity,
@Embeddable 或者 @MappedSuperclass的类。

3.2 Spring Data JPA Repositories

Spring Data
JPA仓库(repositories)是用来定义访问数据的接口。JPA会根据你的点子名机关成立查询。比如,一个CityRepository接口可能表明一个findAllByState(String
state)方法,用来寻找给定状态的具备城市。 
连续Repository
、CrudRepository或者PagingAndSortingRepository接口的接口即为Spring
JPA的repositories。Spring
Boot会自动检索这个接口,并通过措施名自动生成JPA
queries。更扑朔迷离的询问可凭借Spring Data的Query注脚。

3.3 成立和删除JPA db

默认情形下,唯有应用嵌入式DB(H2,
HSQL或Derby)时,jpa数据库才会被自动创立。 
可以透过spring.jpa.*性能来布置jpa,例如: 
spring.jpa.hibernate.ddl-auto=create-drop可打开自动创制和删除表,并且默认情状下,ApplicationContext启动之后才会进行DDL。 
spring.jpa.generate-ddl
也得以用来安插生成表,可是Hibernate自动配置下,该选项不会被激活,因为Hibernate的ddl-auto属性更适用。

九、使用NoSQL

Spring Data支持MongoDB, Neo4J,
Elasticsearch, Solr, Redis, Gemfire,
Couchbase 和Cassandra等NoSQL技术。 
Spring Boot可以自行配置内部的Redis, MongoDB, Elasticsearch, Solr 和
卡桑德拉。其余必要手动配置。

1. Redis

spring-boot-starter-redis自动导入依赖。Spring
boot会自动配置RedisConnectionFactory, StringRedisTemplate
或者RedisTemplate。默许,这么些实例会一连localhost:6379。 
例子:

@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}

假诺您添加一个祥和的别的机关配置项目标@Bean,它将替换默许的(除了RedisTemplate的情状,它是基于bean的名称’redisTemplate’而不是它的花色举行破除的)。假如在classpath路径下存在commons-pool2,默许你会得到一个连接池工厂。

2. MongoDB

spring-boot-starter-data-mongodb导入体贴。 
Spring
boot自动配置MongoDbFactory和MongoTemplate。默许实例使用mongodb://localhost/test 
可设置以下属性: 
spring.data.mongodb.uri (mongodb3.0) 
spring.data.mongodb.host (mongo 2.x) 
spring.data.mongodb.port 
Spring Data MongoDB也襄助和Spring Data JPA一样的Repository接口,Spring
Data会根据章程名自动生成queries。

3. Solr

Apache Solr是个搜索引擎。 Sprint Boot利用Spring Data
Solr为Solr4客户端库提供基本的活动配置。spring-boot-starter-datasolr导入依赖。Solr5暂不辅助。 
Spring Boot自动配置SolrServer,默许连接localhost:8983/solr 
Spring
Data也为Solr提供与JPA一样的Repositories,只不过实体注脚为@SolrDocument。

4. Elasticsearch

Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring
Boot利用Spring Data
Elasticserach为Elasticsearch提供基本的机动配置。spring-boot-starter-data-elasticsearch导入信赖。 
Spring
boot自动配置ElasticsearchTemplate或Client实例,并且默认连接一个地面的内存服务器(即一个NodeClient),可安装spring.data.elasticsearch.cluster-nodes连接受remote
server(TransportClient)。 
Spring
Data也为Elasticsearch提供与JPA一样的Repositories,只但是实体申明为@Document。

十、缓存

Spring
框架扶助透明地为使用添加缓存。其基本是抽象层将缓存应用到方式,裁减执行次数。可以使用JSR-107(JCache)评释后者水平自己的缓存讲明达成缓存。 
JCache示例:

import javax.cache.annotation.CacheResult;
import org.springframework.stereotype.Component;
@Component
public class MathService {
@CacheResult
public int computePiDecimal(int i) {
// ...
}
}

Cache抽象层并不提供真正的仓储,它借助于org.springframework.cache.Cache

org.springframework.cache.CacheManager提供的抽象。开启@EnableCaching之后,SpringBoot会根据贯彻全自动配置一个适龄的CacheManager。 
spring-boot-starter-cache导入依赖。 
Spring Boot会依如下顺序检测缓存provider。

  • Generic
  • JCache (JSR-107)
  • EhCache 2.x
  • Hazelcast
  • Infinispan
  • Redis
  • Guava
  • Simple

也可使用spring.cache.type指定使用哪个种类缓存。 
若由Spring Boot自动配置CacheManager,
你可以透过落到实处CacheManagerCustomizer接口在cachemanager在一点一滴先河化之前调整其计划:

@Bean
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(Arrays.asList("one", "two"));
}
};
}

1. Generic (自定义Cache)

当至少自定义了一个org.springframework.cache.Cache bean时,Generic
caching会被启用,并且会配备一个CacheManager来包装它们。

2. JCache

当javax.cache.spi.CachingProvider(那是个JSR107包容的缓存库)在classpath中时,JCache会被启动。当有多少个provider时,必须经过spring.cache.jcache.provider明确指定一个。还可通过spring.cache.jcache.config来指定布置文件的地方。 
有一些措施可以定制化javax.cache.cacheManager:

  • 可以在启动时指定spring.cache.cache-names创制caches。也可定义javax.cache.configuration.Configuration
    bean去定制化。
  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer
    beans会被调用,并传到CacheManager来定制。

3. EhCache2.x

在classpath跟路径下如果发现了ehcache.xml,EhCache2.x会被应用。也可选择指定spring.cache.ehcache.config=classpath:config/another-config.xml其他文件。

4. Redis

若配置了Redis,RedisCacheManager会被电动配置。也足以由spring.cache.cache-names指定。 
Hazelcast和Infinispan略。

5. Guava

若果Guava可用,GuavaCacheManager会被安插。也可通过spring.cache.cache-names指定。

6. Simple

假若上述选项都没得逞,一个用到ConcurrentHashMap的不难已毕会被计划为cache
store.

十一、消息

Spring
Framework框架为集成信息系统提供了伸张帮助:从使用JmsTemplate简化JMS API,到落到实处一个完好无损异步音讯接收的最底层设施。 
Spring AMQP提供一个貌似的用于’Advanced Message Queuing
Protocol’的特征集,并且Spring
Boot也为RabbitTemplate和RabbitMQ提供了活动配置选项。 
Spring WebSocket提供原生的STOMP音信协理,并且Spring
Boot通过starters和部分机关配置也提供了对它的协理。

1. JMS

javax.jms.ConnectionFactory接口提供了一个专业的用于创制一个javax.jms.Connection的法子,javax.jms.Connection用于和JMS代理(broker)交互。Spring
Boot为收发音信提供了机动配置。

1.1 ActiveMQ 支持

SpringBoot检测到ActiveMQ在classpath中可用时,会安顿一个ConnectionFactory。可配备如下属性: 
spring.activemq.broker-url=tcp://192.168.1.210:9876 
spring.activemq.user=admin 
spring.activemq.password=secret

1.2 HornetQ支持

匡助的性能有embedded,native。spring-boot-starter-hornetq导入依赖。

1.3 Artemis 支持

Apache
Artemis是在二零一五年HornetQ被捐给Apache基金会随后建立的,所有特性和HornetQ一样。spring-boot-starter-artemis导入信赖

2. AMQP

AMQP是一个面向音信的,平莱比锡立、wire-level(指的是并非定义api和库,而是定义会话字节流,类似http)的中间件协议。

2.1 RabbitMQ支持

RabbitMQ是轻量级,可相信的,可扩展的,轻便的基于AMQP协议的音讯代理。Spring利用RabbitMQ落成AMQP协议。可经过spring.rabbitmq.*性能组来配置,如: 
spring.rabbitmq.host=localhost 
spring.rabbitmq.port=5672 
spring.rabbitmq.username=admin 
spring.rabbitmq.password=secret 
Spring boot会自动配置AmqpTemplate,AmqpAdmin,RabbitMessagingTemplate。

十二、发送邮件

Spring
Boot自动配置JavaMailSender来发送邮件。spring-boot-starter-mail导入珍惜。 
可通过spring.mail.*特性组来配置。

十三、JTA处理分布式事务

Spring
Boot使用一个Atomkos或Bitronix的内嵌事务管理器来支撑跨六个XA资源的分布式JTA事务。当陈设到一个适中的J2EE应用服务器时也会支撑JTA事务。 
当发现一个JTA环境时,Spring
Boot将选取Spring的JtaTransactionManager来保管业务。自动配置的JMS,DataSource和JPA beans将被进步以帮衬XA事务。 
您可以选取规范的@ransactional来参加到一个分布式事务中。可设置ring.jta.enabled=alse来剥夺JTA自动配置效应。 
spring-boot-starter-jta-atomikos和spring-boot-starter-jta-bitronix导入看重。

十四、Spring Session

Spring
Session为管理用户的session新闻提供支撑。若web应用的classpath中有spring
session 和spring data redis,spring
boot会通过@EnableRedisHttpSession自动配置Spring
session。Session数据被贮存在redis中,超时期限可通过server.session.timeout设置。

十五、测试

spring-boot-starter-test提供以下库: 
• spring-test提供合一测试协助 
• JUnit 
• Hamcrest—为JUnit提供assertThat支持 
• Mockito

1. 测试Spring Boot应用

Spring
Boot提供@SpringApplicationConfiguration替代spring-test标准的@ContextConfiguration声明。测试中利用@SpringApplicationConfiguration配置ApplicationContext,ApplicationContext会被SpringApplication创制,并且带有额外的Spring
boot的风味。实例:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleDataJpaApplication.class)
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
// ...
}

 

其它加上@WebIntegrationTest 或 @WebAppConfiguration表明,会使得context
loader认为你在测试web应用。例如,为测试类增进@WebIntegrationTest会以web应用措施启动测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleDataJpaApplication.class)
@WebIntegrationTest
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
RestTemplate restTemplate = new TestRestTemplate();
// ... interact with the running server
}

 

可以使用@WebIntegrationTest评释的server.port等特性修改端口。例如:@WebIntegrationTest(“server.port:9000”)。假设将server.port和management.port置为0,应用的融会测试将运用任意端口,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MyApplication.class)
@WebIntegrationTest({"server.port=0", "management.port=0"})
public class SomeIntegrationTests {
// ...
}

十六、Actuator(促动器):: Production-ready features

Springboot提供一些特点帮你在使用计划到生产条件后监视和管理拔取。可透过HTTP,JMX甚至remote
shell(SSH,Telnet)来治本和监视。审计,健康和数据采集会自动应用到你的运用。 
HTTP唯有在依照Spring MVC的使用中才可用。

1. 开启production-ready 特性

spring-boot-actuator提供Spring boot的production ready特性。 
Actuator是机械术语,指移动或决定其余东西的机械设备。Actuator通过微小的转移暴发很大的移位。 
spring-boot-starter-actuator导入依赖。

2. endpoints 端点

Actuator端点使您可以监视应用并与之相互。Spring
boot包括部分内置的端点(例如health端点),你也可以团结扩充。 
端点被揭示的点子取决于采纳的技巧项目。大多采取选用HTTP监视,那样端点的ID被map到URL。如health端点被map到/health.

2.1 常用端点

ID 描述 是否敏感
actuator 为其他端点提供一个基于超媒体(hypermedia-based)的发现页面。需要Spring HATEOAS支持 true
autoconfig 显示一个auto-configuration的报告,该报告展示所有auto-configuration候选者及它们被应用或未被应用的原因 true
beans 显示一个应用中所有Spring Beans的完整列表 true
health 展示应用的健康信息(当使用一个未认证连接访问时显示一个简单的’status’,使用认证连接访问则显示全部信息详情) false
info 显示任意的应用信息 false
dump 执行一个线程转储 true
mappings 显示一个所有@RequestMapping路径的整理列表 true
trace 显示trace信息(默认为最新的一些HTTP请求) true

怎么样是”是否敏感”? 
在于你咋样暴光端点,敏感性可以看做安全提醒。例如,假使运用HTTP并且打开了Spring
Security,那么访问敏感端点须求用户名和密码。

2.2 CORS跨域资源共享接济

Cross-origin resource
sharing,是个W3C规格,它为Web服务器定义了一种方法,允许网页从不一致的域访问其资源(如字体),简言之,CORS就是为了让AJAX可以达成可控的跨域访问而生的。Actuator的MVC端点可以布置辅助本场景:

endpoints.cors.allowed-origins=http://example.com
endpoints.cors.allowed-methods=GET,POST

3. 透过HTTP监控和治本

付出Spring MVC应用时,Spring Boot
Actuator会自动配置所有打开的端点,并经过HTTP暴光。默许的预约是端点id被map到url,如health到/health。

3.1 敬重敏感端点

假定使用了Spring
security,所有通过HTTP暴光的灵巧的端点都会被保险。默许会接纳基本表明(basic
authentication,用户名为user,密码为利用启动时在控制台打印的密码)。 
你可以使用Spring属性改变用户名,密码和做客端点要求的安全角色。例如,在application.properties中添加下列配置:

security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER

3.2 定制管理端点的路线

可因此如下设置为端点的url设置前缀:

management.context-path=/manage

 

也可修改端点的id或者path来落成修改path的目标:

endpoints.health.id = fuck
endpoints.health.path = /fuck/damn

3.3 定制管理服务器的端口

针对基于云的配置,使用默许HTTP端口揭露管理端点相比较明智。假使采取运行在祥和的多少主导,可以如下修改端口:

management.port=8081

相似意况下里面拔取的管住端口都被防火墙体贴,不对外开放,由此能够如下关掉敬服:

management.security.enabled=false

※ 只有在启用Spring security才有要求肯定的关闭,否则反而可能损坏应用。

3.4 定制管理服务器地址:

management.port=8081
management.address=127.0.0.1

3.5 关掉http端点

management.port=-1

4. 心地目标Metrics

Spring Boot
Actuator包罗一个支撑’gauge’和’counter’级其余气量目的服务。’gauge’记录一个单一值;’counter’记录一个增量(增添或缩短)。 
富有HTTP请求的胸襟目的都会被自动记录,通过metrics端点(/metrics)即可访问。

4.1 系统度量目标

Spring Boot暴露以下系统目标: 
系统内存总量(mem),单位:Kb 
闲暇内存数量(mem.free),单位:Kb 
计算机数量(processors) 
系统正常运转时刻(uptime),单位:毫秒 
利用上下文(就是一个采纳实例)正常运作时刻(instance.uptime),单位:微秒 
系统平均负载(systemload.average) 
堆信息(heap,heap.committed,heap.init,heap.used),单位:Kb 
线程音信(threads,thread.peak,thead.daemon) 
类加载新闻(classes,classes.loaded,classes.unloaded) 
污染源收集音信(gc.xxx.count, gc.xxx.time)

4.2 数据源目标

以下目标会被爆出(前缀都是datasource.): 
活泼连接数(datasource.xxx.active) 
眼前连接池使用率(datasource.xxx.usage)

4.3 缓存目标

以下目标会被爆出: 
当前cache大小(cache.xxx.size) 
命中率(cache.xxx.hit.ratio) 
未命中率(cache.xxx.miss.ratio)

4.4 tomcat session指标

若选拔tomcat做嵌入的servlet容器,session目的会被暴光: 
活跃session数:httpsessions.active 
最大session数:httpsessions.max

十七、部署SpringBoot应用

Spring Boot灵活的打包选项帮您更便于的将Spring Boot
应用布置到云平台,容器镜像,虚拟机或者实体机。

1. 安排到云

Spring Boot的可实施jar包可以安顿到多数流行的PaaS(Platform as a
service)云提供者。这几个云提供者须求使用者“带好自己的容器”;而它们管理选择进度。所以它们须求有的中档层来将您的选拔适配到云概念中的一个运转进程。 
七个流行的云提供者,Heroku和Cloud
Foundry,选拔一种“buildpack”格局。Buildpack将您布置的代码打包进任何启动应用所需的包里:可能是个JDK和一个java调用,可能是一个嵌入式web服务器,也恐怕是一个一体化的应用服务器。一个buildpack是可插拔的,但你最好尽可能少的对它举行自定义设置。那足以减去不受你控制的职能范围,并最小化开发和生产条件的出入。 
漂亮图景下,你的施用比如一个Spring
boot可举办jar包,应涵盖它运行所需的一切。 
还有OpenShift, Boxfuse和Amazon Web Service也支持Spring boot jar的部署 
Goole App Engine只协理Servlet 2.5,要布局Springboot应用须要做修改。

2. 安装Spring Boot 应用。

除开行使jar –jar运行可实施jar包,还足以编译成Unix上的完全可实施应用:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>

CentOS和Ubuntu上都已协助此功效。那样就可将利用以unix/Linux service的法子启动。

参考链接

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

发表评论

电子邮件地址不会被公开。 必填项已用*标注