Spring Boot是Spring框架的约定优于配置的实现,提供开箱即用的实现,这些实现都以spring-boot-starter-作前缀命名,都位于org.springframework.boot包或者命名空间下css
配置方式有几类:java
·命令行参数(Command Line Args)。mysql
·系统环境变量(Environment Variables)。
·位于文件系统中的配置文件。
·位于classpath中的配置文件。
·固化到代码中的配置项。web
以上几种方式按照优先级从高到低排列,高优先级方式提供的配置项能够覆盖或者优先生效,好比经过命令行参数传入的配置项会覆盖经过环境变量传入的同一配置项,固然也会覆盖其余后面几种方式给出的同一配置项。
不论是位于文件系统仍是classpath,SpringBoot应用默认的配置文件名叫做application.properties,能够直接放在当前项目的根目录下或者名称为config的子目录下。redis
spring-boot-starter-loggingspring
默认用的logback,能够更改成log4j和log4j2,在maven中声明相似spring-boot-starter-log4j的依赖便可sql
spring-boot-starter-webmongodb
自动配置springmvc和tomcat,默认run会在8080端口启动tomcat,并生成一个默认的错误页面数据库
能够新建一个服务根路径的web请求的controller实现:tomcat
@RestControllerpublic class IndexController { @RequestMapping("/") public String index() { return "hello, there"; }} 从新运行mvn spring-boot:run并访问http://localhost:8080,错误页面将被咱们的Controller返回的消息所替代,一个简单的Web应用就这样完成了。
项目结构层面与传统打包为war的Java Web应用的差别在于,静态文件和页面模板的存放位置变了,原来是放在src/main/webapp目录下的一系列资源,如今都统一放在src/main/resources相应子目录下,好比:
1)src/main/resources/static用于存放各种静态资源,好比css,js等。
2)src/main/resources/templates用于存放模板文件,好比*.vm。
默认是jar形式的打包,能够改成war
spring-boot-starter-web默认将为咱们自动配置以下一些SpringMVC必要组件:
·必要的ViewResolver,好比ContentNegotiatingViewResolver和Bean-NameViewResolver。
·将必要的Converter、GenericConverter和Formatter等bean注册到IoC容器。
·添加一系列的HttpMessageConverter以便支持对Web请求和相应的类型转换。
·自动配置和注册MessageCodesResolver。
任什么时候候,若是咱们对默认提供的SpringMVC组件设定不满意,均可以在IoC容器中注册新的同类型的bean定义来替换,或者直接提供一个基于WebMvcConfigurerAdapter类型的bean定义来定制,甚至直接提供一个标注了@EnableWebMvc的@Configuration配置类彻底接管全部SpringMVC的相关配置,本身彻底从新配置。
spring-boot-starter-web默认使用嵌入式tomcat做为web容器对外提供HTTP服务,默认将使用8080端口对外监听和提供服务:
1)假设咱们不想使用默认的嵌入式tomcat(spring-boot-starter-tomcat自动配置模块),那么能够引入spring-boot-starter-jetty或者spring-boot-starter-undertow做为替代方案。
2)假设咱们不想使用默认的8080端口,那么咱们能够经过更改配置项server.port使用本身指定的端口,好比:
server.port=9000 spring-boot-starter-web提供了不少以server.为前缀的配置项用于对嵌入式Web容器提供配置,好比:
·server.port
·server.address
·server.ssl.*
·server.tomcat.*
若是这些依然没法知足需求,SpringBoot甚至容许咱们直接对嵌入式的Web容器实例进行定制,这能够经过向IoC容器中注册一个EmbeddedServletContainerCustomizer类型的组件来对嵌入式Web容器进行定制:
public class UnveilSpringEmbeddedTomcatCustomizer implements Embed-dedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(9999); container.setContextPath("/unveil-spring-chapter3"); // ... }} 再深刻的定制则须要针对特定的嵌入式Web容器,使用实现对应的Factory并注册到IoC容器:
·TomcatEmbeddedServletContainerFactory
·JettyEmbeddedServletContainerFactory
·UndertowEmbeddedServletContainerFactory
spring-boot-starter-jdbc
大部分Java应用都须要访问数据库,尤为是服务层,因此,SpringBoot会为咱们自动配置相应的数据访问设施。
若想SpringBoot为咱们自动配置数据访问的基础设施,那么,咱们须要直接或者间接地依赖spring-jdbc,一旦spring-jdbc位于咱们SpringBoot应用的classpath,即会触发数据访问相关的自动配置行为,最简单的作法就是把spring-boot-starter-jdbc加为应用的依赖。
默认状况下,若是咱们没有配置任何DataSource,那么,SpringBoot会为咱们自动配置一个基于嵌入式数据库的DataSource,这种自动配置行为其实很适合于测试场景,但对实际的开发帮助不大,基本上咱们会本身配置一个DataSource实例,或者经过自动配置模块提供的配置参数对DataSource实例进行自定义的配置。
假设咱们的SpringBoot应用只依赖一个数据库,那么,使用DataSource自动配置模块提供的配置参数是最方便的:
spring.datasource.url=jdbc:mysql://{database host}:3306/{databaseName}spring.datasource.username={database username}spring.datasource.password={database password} 固然,本身配置一个DataSource也是能够的,SpringBoot也会智能地选择咱们本身配置的这个DataSource实例(只不过必要性真不大)。
除了DataSource会自动配置,SpringBoot还会自动配置相应的JdbcTemplate、DataSourceTransactionManager等关联“设施”,可谓服务周到,咱们只要在使用的地方注入就能够了:
class SomeDao { @Autowired JdbcTemplate jdbcTemplate; public <T> List<T> queryForList(String sql){ // ... } // ...} 不过,spring-boot-starter-jdbc以及与其相关的自动配置也不老是带来便利,在某些场景下,咱们可能会在一个应用中须要依赖和访问多个数据库,这个时候就会出现问题了。
假设咱们在ApplicationContext中配置了多个DataSource实例指向多个数据库:
@Beanpublic DataSource dataSource1() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;}@Beanpublic DataSource dataSource2() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;} 那么,很差意思,启动SpringBoot应用的时候会抛出相似以下的异常(Exception):
Exception):No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2 为了不这种状况的发生,咱们须要在SpringBoot的启动类上作点儿“手脚”:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})public class UnveilSpringChapter3Application { public static void main(String[] args) { SpringApplication.run(UnveilSpringChapter3Application.class, args); }} 也就是说,咱们须要在这种场景下排除掉对SpringBoot默认提供的DataSource相关的自动配置。
但若是咱们仍是想要享受SpringBoot提供的自动配置DataSource的机能,也能够经过为其中一个DataSource配置添加org.springframework.context.annotation.Primary这个Annotation的方式以实现一箭双鵰:
@Bean@Primarypublic DataSource dataSource1() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;}@Beanpublic DataSource dataSource2() throws Throwable { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(...); dataSource.setUsername(...); dataSource.setPassword(...); // TODO other settings if necessary in the future. return dataSource;} 另外,SpringBoot还提供了不少其余数据访问相关的自动配置模块,好比spring-boot-starter-data-jpa、spring-boot-starter-data-mongodb等,你们能够根据本身数据访问的具体场景选择使用这些自动配置模块。
警告 若是选择了spring-boot-starter-data-jpa等关系数据库相关的数据访问自动配置模块,而且还须要同时依赖访问多个数据库,那么,也须要相应的在SpringBoot启动类中排除掉这些自动配置模块中的AutoConfiguration实现类(对应spring-boot-starter-data-jpa是JpaRepositoriesAutoConfiguration),或者标注某个DataSource为@Primary。
spring-boot-starter-aop
现在,AOP(Aspect Oriented Programming)已经不是什么崭新的概念了,在经历了代码生成、动态代理、字节码加强甚至静态编译等不一样时代的洗礼以后,Java平台上的AOP方案基本上已经以SpringAOP结合AspectJ的方式稳固下来(虽然你们依然能够本身经过各类字节码工具偶尔“打造一些轮子”)。
原则上来讲,咱们只要引入Spring框架中AOP的相应依赖就能够直接使用Spring的AOP支持了,不过,为了进一步为你们使用SpringAOP提供便利,SpringBoot仍是“不厌其烦”地为咱们提供了一个spring-boot-starter-aop自动配置模块。
spring-boot-starter-aop自动配置行为由两部份内容组成:
1)位于spring-boot-autoconfigure的org.springframework.boot.autoconfigure.aop.AopAutoConfiguration提供@Configuration配置类和相应的配置项。
2)spring-boot-starter-aop模块自身提供了针对spring-aop、aspectjrt和aspectjweaver的依赖。
通常状况下,只要项目依赖中加入了spring-boot-starter-aop,其实就会自动触发AOP的关联行为,包括构建相应的AutoProxyCreator,将横切关注点织入(Weave)相应的目标对象等,不过AopAutoConfiguration依然为咱们提供了可怜的两个配置项,用来有限地干预AOP相关配置:
·spring.aop.auto=true
·spring.aop.proxy-target-class=false
对咱们来讲,这两个配置项的最大意义在于:容许咱们投反对票,好比能够选择关闭自动的aop配置(spring.aop.auto=false),或者启用针对class而不是interface级别的aop代理(aop proxy)。
spring-boot-starter-security
主要面向web安全,配合spring-boot-starter-web
默认提供一个基于HTTP的Basic认证,能够对用户密码进行配置
security.user.name=xxx
security.user.password=xxx
还默认启动一些web安全防御,如XSS、CSRF等常见web攻击
SpringSecurity框架包括了基本的认证和受权,也提供了加密解密,统一登陆等支持
AuthenticationManager/ AccessDecisionManager/ AbstractSecurityInterceptor是核心
AuthenticationManager管理身份认证,AccessDecisionManager控制放行,AbstractSecurityInterceptor是关卡的抽象
SpringSecurity基于Servlet规范,因此Play等不基于Servlet规范的框架没法使用
有多个filter,总体有三类:信道与状态管理、web安全防御类,认证和受权类
默认的filter序列间隔步长为10,因此能够在中间自定义filter
spring-boot-starter-actuator
用于SpringBoot应用的监控。内部默认提供了不少endpoint。
“监”抽象为Sensor类,“控”抽象为Actuator类。每类都有不少内置的endpoint。
Sensor类包括autoconfig、beans、configprops、info、health、env、metrics、trace、mapping
Actuator类包括shutdown(慎用)、dump
建议使用的方式是所有禁用,而后按需开启
health默认提供了数据源、磁盘空间、redis、solr、mongo等监控