Profiles
在Spring
Boot中Profiles更简单了。我们使用application-{profile}.properties格式来区分不同的Profile,例如一个测试profile(application-test.properties),一个生产环境profile(application-product.properties)。
定义好多个Profiles之后,还需要在标准的application.properties中列出和启用这些Profiles。列出使用spring.profiles.include,激活其中的一个使用spring.profiles.active。
spring.output.ansi.enabled=always spring.thymeleaf.cache=false spring.profiles.include[0]=test spring.profiles.include[1]=product spring.profiles.active[0]=test
使用YAML
YAML也是一种配置文件格式,比方说上面的properties,就可以改写为下面这样的YAML文件(application.yaml)。
spring: output: ansi: enabled: always thymeleaf: cache: false profiles: include: - product - test active: test
如果需要多个Profile,YAML只需要一个文件即可,profiles之间使用---分隔开。
server: address: 192.168.1.100 --- spring: profiles: development server: address: 127.0.0.1 --- spring: profiles: production server: address: 192.168.1.120
使用Properties还是YAML,根据个人喜好即可。
自动配置
修改自动配置
Spring
Boot的核心就是自动配置,它为几乎所有的Spring组件都提供了相应的自动配置类,而且默认是打开的。所以只要相关的jar文件存在,这些自动配置就会被使用。其中有些配置属于必配的(例如Web模板),自动配置会为我们省下不少时间;有些配置(例如数据源)则往往需要我们修改。Spring的自动配置是非侵入式的,所以如果我们声明了自己的数据源,那么Spring自动配置的嵌入式数据源就会取消。
当然如果想要关闭某些自动配置也是可以的。如果你有自己的主配置类,手动在上排除某些自动配置类即可。
@Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
如果我们使用了SpringBootApplication注解,那么上面这种方式需要修改一下。SpringBootApplication注解提供了几个属性,可以控制排除的自动配置和组件搜索的路径。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class SpringBootSampleApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSampleApplication.class, args); } }
另外还可以直接修改项目的属性。我们可以编辑application.properties文件,在其中添加spring.autoconfigure.exclude属性并指定要排除的类即可。
Spring的自动配置类一般在org.springframework.boot.autoconfigure包下,如果我们需要查看当前使用了多少个自动配置类,可以在运行程序的时候添加--debug标志,这样Spring会打印额外的调试信息。如果需要详细的自动配置类的列表,可以参考Spring
Boot文档 附录C. Auto-configuration
classes。
Spring Web MVC自动配置
自动配置
MVC自动配置会启用以下功能。
- ContentNegotiatingViewResolver 和 BeanNameViewResolver beans.
- 静态资源和WebJars的支持.
- 自动注册 Converter, GenericConverter, Formatter beans.
- HttpMessageConverters 的支持.
- 自动注册MessageCodesResolver.
- 静态index.html的支持.
- 自定义Favicon(浏览器页面的小图标) 支持.
- 自动使用ConfigurableWebBindingInitializer bean.
自动注册指的是,只需要在Spring中注册相应类型的Bean。Spring Web
MVC会自动识别和使用这些Bean。例如,我们要添加新的HttpMessageConverter,只需要向下面这样。
@Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); } }
静态资源
静态资源默认放在resources文件夹的/static (或/public或 /resources 或/META-INF/resources下面。如果需要配置位置的话,在属性文件中添加spring.mvc.static-path-pattern=/resources/**。
如果需要静态主页,直接在resources/static/下放入一个index.html即可。
favicon.ico
如果需要配置自己的favicon.ico,只需要将自己的favicon.ico直接放到resources文件夹下即可。
视图模板
Spring会对Thymeleaf、Freemarker、Groovy和mustache四种模板进行自动配置。默认的模板路径为resources/templates。
错误处理
错误处理和一般的Spring Web MVC类似,使用@ControllerAdvice。
自定义错误页面放在下面的路径。
src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
如果错误页面也需要使用模板引擎动态生成,那么放在下面的路径。
src/ +- main/ +- java/ | + <source code> +- resources/ +- templates/ +- error/ | +- 5xx.ftl +- <other templates>
SQL数据库自动配置
嵌入式数据库
如果类路径中包含HSQL、Derby或H2的相应jar包,那么Spring就会自动配置这些嵌入式数据库的实例和数据源。它们会将数据保存在内存中,当程序结束之后数据会丢失。这非常适合开发和测试。
在不同的测试中Spring默认会重用这些嵌入式数据库。假如不同测试之间的数据不同,你可能希望每次测试都使用新的数据库。这时候可以在属性文件中指定spring.datasource.generate-unique-name=true。
生产数据库
Spring会自动选择带连接池的数据源,遵循以下规则:
- 如果存在tomcat-jdbc数据源,则使用它。
- 否则,如果存在HikariCP,则使用它。
- 如果前两个都不存在,而存在DBCP2,则使用它。
这时候我们需要提供数据源的额外配置信息。
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
JdbcTemplate
JdbcTemplate和NamedParameterJdbcTemplate会由上面的数据源自动配置。我们直接使用@Autowire注入到程序中即可。
JPA自动配置
实体类
JPA Entity类(标记了@Entity的类)默认在persistence.xml中配置。在Spring
Boot中,@EnableAutoConfiguration 或
@SpringBootApplication包下的实体类会被自动扫描到。如果希望自定义实体类的位置,可以使用@EntityScan注解,添加到配置类上即可。