最近在看JavaEE开发的颠覆者 Spring Boot实战 这本书,想把自己看到的知识点写下来。
1.0 入门类和@SpringBootApplication
Spring Boot通常有一个为*Application的入门类,入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法。在main方法中使用SpringApplication.run(Application.class,args);,启动Spring boot应用项目。@SpringBootApplication是Spring boot的核心注解,他是一个组合注解,代码如下
@SpringBootApplication注解主要组合了@Configuration,@EnableAutoConfiguration,@ComponentScan;若不使用 @SpringBootApplication注解,则可以在入口类上直接使用@Configuration,@EnableAutoConfiguration,@ComponentScan
其中,@EnableAutoConfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。
例如,添加了spring-boot-starter-web依赖,会自动添加tomcat和spring mvc的依赖,那么spring boot会对Tomcat和Spring mvc进行自动配置。
又如,添加了spring-boot-starter-data-jpa依赖,Spring Boot会自动进行JPA相关的配置
Spring Boot会自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean。建议入口类放置的位置在groupId+arctifactID组合的包名下。
1.1 关闭特定的自动配置
通过上面的@SpringBootApplication的源码,可以看出,关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数,例如:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
Spring Boot配置文件
Spring Boot使用一个全局的配置文件 application.properties,放置在src/main/resources目录或者类路径的/config下
比如将tomcat的默认端口号8080修改为9090,并将默认的访问路径修改为“/helloboot”
server.port=9090
Server.context-path=/helloboot
1.2 使用xml配置
Spring Boot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过Spring提供的@ImportResource来加载xml配置,例如:
@ImportResource({"classpath:some-context.xml",classpath:another-context.xml})
2.0
spring运行原理
Spring Boot关于自动配置的源码在spring-boot-autoconfigure-1.3.0.x.jar内.
关于Spring Boot的运行原理,我们还是回归到@SpringBootApplication注解上来,这个注解是一个组合注解,她的核心功能是由@EnableAutoConfiguration注解提供的
这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,而spring-boot-autoconfigure-1.3.0.x.jar内就有一个spring.factories文件。
下面我们简单分析一下条件注解@ConditionalOnWebApplication。
从源码可以看出,此注解使用的条件是OnWebApplicationCondition,下面看看这个类的源码:
从isWebApplication方法可以看出,判断条件是:
1)容器里是否有名为session的scope
2)当前容器的Enviroment是否为StandardServletEnvironment
3)当前的Resource是否为WebApplicationContext(ResourceLiader是ApplicationContext的顶级接口之一)
4)我们需要构造ConditionOutcome类的对象来帮助我们。最终通过ConditionOutcome.isMatch方法返回布尔值来确定条件。
3.0实例分析:
分析一个简单的spring Boot内置的自动配置功能:http的编码配置我们在常规项目中配置http编码的时候是在web.xml里配置一个filter,如:CharacterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingutf-8forceRequestEncodingtrueforceResponseEncodingtrueCharacterEncodingFilter/*自动配置要满足两个条件:
1)能配置CharacterEncodingFilter这个Bean;
2)能配置encoding和forceEncoding
这两个参数3.1 配置参数在6.2.3节我们讲述了类型安全的配置,Spring Boot的自动配置也是基于这一点实现的,这里的配置类可以在application.properties中直接设置,源码如下:
1)在application.properies配置的时候前缀是spring.http.encoding
2)默认编码方式为utf-8,若修改可使用spring.boot.charset=编码
3)设置forceEncodeing,默认为true,若修改可使用spring.http.encoding.force=false;
配置Bean
通过上述配置,并根据条件配置CharacterEncoding的Bean。
1)开启属性注入,通过@EnableConfigurationProperties声明,使用@Autowired注入;
2)当CharacterEncodingFilter在类路径的条件下;
3)当设置spring.http.encoding=enabled的情况下,如果没有设置则默认为true,则条件符合;
4)像使用java配置的方式配置CharacterEncodingFilter这个Bean;
5)当容器中没有这个Bean的时候新建Bean