Spring Boot基本配置(一)

最近在看JavaEE开发的颠覆者 Spring Boot实战 这本书,想把自己看到的知识点写下来。

1.0 入门类和@SpringBootApplication

Spring Boot通常有一个为*Application的入门类,入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法。在main方法中使用SpringApplication.run(Application.class,args);,启动Spring boot应用项目。@SpringBootApplication是Spring boot的核心注解,他是一个组合注解,代码如下

Spring Boot基本配置(一)_第1张图片

@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注解提供的

Spring Boot基本配置(一)_第2张图片

这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,而spring-boot-autoconfigure-1.3.0.x.jar内就有一个spring.factories文件。

Spring Boot基本配置(一)_第3张图片

下面我们简单分析一下条件注解@ConditionalOnWebApplication。

Spring Boot基本配置(一)_第4张图片

从源码可以看出,此注解使用的条件是OnWebApplicationCondition,下面看看这个类的源码:

Spring Boot基本配置(一)_第5张图片

从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;


Spring Boot基本配置(一)_第6张图片

配置Bean

通过上述配置,并根据条件配置CharacterEncoding的Bean。

1)开启属性注入,通过@EnableConfigurationProperties声明,使用@Autowired注入;

2)当CharacterEncodingFilter在类路径的条件下;

3)当设置spring.http.encoding=enabled的情况下,如果没有设置则默认为true,则条件符合;

4)像使用java配置的方式配置CharacterEncodingFilter这个Bean;

5)当容器中没有这个Bean的时候新建Bean

Spring Boot基本配置(一)_第7张图片
下一篇想要写Spring Boot整合thymeleaf和tomcat的配置

你可能感兴趣的:(Spring Boot基本配置(一))