Spring Boot 自动配置
参考书《Spring Boot实战》
1.Spring 配置的发展历程
Spring是JEE(也称J2EE Java企业版 Java Enterprise Edition)的轻量级替代品,简化了企业级Java开发,无需开发重量级的EJB(enterpise JavaBean)。Spring通过依赖注入和面向切面编程,用简单的Java对象实现了EJB的功能。
但是,虽然Spring的组件代码是轻量级的,但它的配置是重量级的。Spring的配置包括 全局配置:JPA的配置,MVC 的配置,Servlet,Filter的配置等。 和 业务相关的配置。
1.Spring 刚开始是XML配置。全局配置和业务相关的配置 都使用XML显示配置
2.Spring2.5引入了基于注解的组件扫描,消除了大量针对应用程序自身组件的配置。简化了业务相关的配置,业务相关的配置不再使用XML
3.Spring3.0引入了基于Java的配置,这是类型安全的可重构配置方式,可代替XML。简化了全局配置,全局配置也不再使用XML配置,但是还是要显示配置。
虽然组件扫描减少了配置量,Java配置让它看上去更简洁。但是Spring还是有很多配置,开启某些Spring特性时,比如事务管理和Spring MVC 还是需要XML或Java进行显示配置。配置Servlet和过滤器还是需要显示配置。Spring的配置 会使应用程序开发耗时更长,因为写配置占用了写应用程序逻辑的时间。思考Spring特性配置和解决业务问题之间需要进行思维切换。
4.Spring Boot 通过自动配置 来 简化配置,是针对全局配置,使得全局配置 甚至也不需要显示配置。
总结: 业务相关的配置 的 :XML ---基于注解的组件扫描
全局配置: XML显示配置 ----Java 显示配置 -----Spring boot 自动配置
2.Spring Boot 自动配置
针对很多Spring应用程序常见的功能,Spring Boot能自动提供相关配置,从而简化了Spring应用程序的配置,可以专注于开发Spring应用程序的功能。Spring Boot自动配置涉及Java持久化API,Thymeleaf模板,安全和Spring MVC。 Spring Boot自动配置 代替的是 Spring Java 或xml配置中 应用程序相关的配置, 不是简化 业务代码相关的配置。
Spring Boot 利用Spring 4.0 的条件化配置实现自动配置:条件化配置允许配置存在于应用程序中,但是在满足某些特定条件之前都忽略这个配置。在Spring中编写自己的条件,就是实现Condition接口,覆盖match()方法。Spring Boot定义了很多条件,并把它们运用到配置类上,这些配置类构成了Spring Boot的自动配置。
Spring Boot的自动配置是一个运行时过程:在应用程序启动时 ,考虑众多因素,决定Spring 配置应用用哪个,不用哪个。
比如,在Spring Boot应用程序启动时,自动配置会做出很多决策:
因为Classpath里有H2,就会自动创建一个嵌入式的H2数据库Bean,它的类型是javax.sql.DataSource,JPA实现需要用它来访问数据。
因为Classpath里有Hibernate 的实体管理器,所以自动配置 会配置与Hibernate相关的Bean,包括Spring的LocalContainerEntityManagerFactoryBean和JpaVenderAdapter。
因为Classpath里有Spring Data JPA,所以它会自动配置为 根据仓库的接口 创建仓库的实现。
因为Classpath里有Thymeleaf,所以Thymeleaf会配置为Spring MVC的视图,包括一个Thymeleaf的 模板解析器,模板引擎以及视图解析器,视图解析器 会解析 相对于Classpath根据的/templates目录里的模板。
因为Classpath里有Spring MVC(归功于Web起步依赖),所以会配置Spring的DispatcherServlet并启用Spring MVC。
因为这是一个Spring MVC Web应用程序,所以会自动注册一个 资源处理器,把相对于Classpath根目录的/static目录里的静态内容 提供出来。这个资源处理器还能处理 /public, /resources 和 /META-INF/resources的静态内容。
因为Classpath里有Tomcat(通过Web起步依赖传递引用),所以会启动一个嵌入式的的Tomcat容器,监听8080端口。
如果没有使用Spring Boot,以上这些配置,都是需要我们手动去配置在配置类里的。
3.使用Spring Boot自动配置
一旦那些依赖出现在Classpath中,一系列自动配置就会接踵而来。。Spring Boot提供了简化企业家开发绝大多数场景的starter pom(起步依赖),只要在应用程序中使用了需要的starter pom,相关的技术配置将会消除,就可以得到Spring Boot提供的自动配置的Bean。 除了Spring Boot官方的 起步依赖,还是很多第三方为Spring Boot提供的起步依赖。
4.Spring Boot的模板引擎
Spring Boot 提供了大量模板引擎,推荐使用Thymeleaf作为模板引擎,因为Thymeleaf提供了完美的Spring MVC的支持。PS: JSP在内嵌的Servlet的容器上运行有一些问题:内嵌Tomcat和Jetty不支持以jar形式运行JSP,Undertow不支持JSP。所以Spring Boot中的模板引擎不用JSP。Spring Boot中可以使用Thymeleaf 完全代替 JSP。
如果没有使用Spring Boot,需要在Spring MVC中集成一个模板引擎 (JSP或者Thymeleaf),那需要手动配置ViewResolver,具体可以参考 SpringMVC 视图解析器 SpringMVC对JSP的支持---支持JSTL标签库。 借助Spring Boot,如果在项目中需要使用Thymeleaf模板,那不需要配置,只需要引入Thymeleaf 起步依赖。然后Spring Boot的org.springframework.boot.autoconfigure.
thymeleaf包对Thymeleaf进行了自动配置。其中ThymeleafAutoConfiguration类对集成需要的bean进行自动配置 包括templateResolver,templateEngine和thymeleafVeiwResolver。然后通过ThymeleafProperties来配置Thymeleaf。这里可查看下源码来看下Spring Boot为实现自动配置做了什么工作,其实和通过Java配置 手动配置差不多的。