版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/103026876
文章目录
本篇主要来讲解 @SpringBootApplication注解,本篇没有具体示例,只是简单的理论介绍,初学者了解即可。
我们一般将被 @SpringBootApplication注解 修饰的类称之为是 Spring Boot 的主配置类,Spring Boot 之所以能提供强大的功能,全是因为依赖了这个注解。我们开启项目就是从主配置类中的 main方法 开启的,所以主配置类配置的一切信息,都是对整个项目的配置。
这个注解中包含了很多子注解,我们今天就来主要看一下 @SpringBootConfiguration 和 @EnableAutoConfiguration 这两个注解。
一、@SpringBootConfiguration注解
@SpringBootConfiguration注解 是 Spring Boot 的配置类注解。
在这个注解中包含一个非常重要的注解 —— @Configuration注解,被 @Configuration注解 修饰的类 表示 “配置类”。
我们以前写的 “配置文件” 可能在大型项目中配置项会过于庞大,而为了解决这个问题,Spring Boot 更推荐我们使用 “配置类” 来代替 “配置文件”。
加了 @Configuration注解 的类,会自动纳入到 Spring容器 中。(通过源码得知:在 @Configurtion注解 中包含了 @Component【@Component注解 表示交由 Spring 进行管理】)
// 表示 A 这个类是一个用于 配置的类
@Configuration
public class A {
// ...
}
二、@EnableAutoConfiguration注解
@EnableAutoConfiguration注解 是 自动配置注解。该注解能使 Spring Boot 实现自动配置。
在这个注解中包含 @AutoConfigurationPackage注解,被 @AutoConfigurationPackage注解 修饰的类会将该类所在的包纳入到扫描器中,就不再需要我们手动进行注册了。
根据源码可知: Spring Boot 在启动时,会根据该注解所在包中的
META-INF/spring.factories
文件,找到相应的三方依赖配置信息,并将这些依赖引入本项目。 Spring Boot 的核心理念就是 “习惯优于配置”,它的主要实现就是 @EnableAutoConfiguration注解。( spring.factories文件已经包含了市场上所有主流的三方依赖初始配置信息 )总的来说,@EnableAutoConfiguration注解 的作用就是将该包及其所有子包全部纳入 Spring容器。
package com.example.Demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// 此注解会将 com.example.Demo 纳入到 Spring容器 中
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
三、如何实现自动装配?(以 HttpEncodingAutoConfiguration类 为例)
我们可以考虑一下,Spring Boot 是如何实现自动装配的?
我们以 HttpEncodingAutoConfiguration类 为例,通过观察其源码了解如何进行自动装配。 (此类的全类名为:org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration)
我们通过源码可知,此类共有五个注解: @Configuration、@EnableConfigurationProperties、@ConditionalOnWebApplication、@ConditionalOnClass、@ConditionalOnProperty。
1、@Configuration
@Configuration(proxyBeanMethods = false)
这个注解用来标识 HttpEncodingAutoConfiguration类 是一个配置类,并将这个类纳入 Spring 容器中;
2、@EnableConfigurationProperties
@EnableConfigurationProperties(HttpProperties.class)
这个注解是用来配置 HttpEncodingAutoConfiguration类 的字符集编码(也就是配置整个项目的字符集编码),通过参数中 HttpProperties 这个类能将字符集编码设置为 UTF_8
(即自动装配为 UTF_8
)。
如果需要要改变字符集编码,我们可以在配置文件(yml/properties)中来手动来修改配置,如下图:
注意: 通过此配置可以将整个项目的字符集编码设置成 UTF_16,可能有小伙伴有疑问,字符集编码的 key (spring.http.encoding.charset)能否修改呢?答案是不可以的。因为在 Spring Boot 中早已规定好了这个 key 的名字,我们可以进入 @EnableConfigurationProperties注解 中的参数 HttpProperties类 的源码中找到这个key的名字(@ConfigurationProperties注解中的 prefix参数),如下图:
从上图可以看出,key 名字的基本格式是:prefix.属性名
。而在字符集中 prefix
的值是 spring.http,属性名是 encoding对象 中的 charset,连起来就是: spring.http.encoding.charset
。
而具体的值,我们可以通过 StandardCharsets类 的源码得知,字符集编码的可选值有: US_ASCII
、ISO_8859_1
、 UTF_8
、 UTF_16BE
、 UTF_16LE
、 UTF_16
。
3、@ConditionalOnWebApplication
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
这个注解 说明了 如果当前项目是一个 Web应用 时(servlet),这个条件就成立。
4、@ConditionalOnClass
@ConditionalOnClass(CharacterEncodingFilter.class)
这个注解 说明了 如果 CharacterEncodingFilter类 存在时,这个条件就成立。
5、@ConditionalOnProperty
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
这个注解 说明了 如果在配置文件中 spring.http.encoding.enabled
这个属性存在时,这个条件就成立。
它在配置文件中的格式是 spring.http.encoding.enabled=XXX
。
matchIfMissing 属性 是用来检测在配置文件中的 spring.http.encoding.enabled
这个属性。如果没有配置,则成立;如果已配置,则不成立。
注: 以上三个注解是条件注解( Conditional 是条件的意思),当 On 后面的类存在时,这个条件才成立,当这三个条件同时都成立时,HttpEncodingAutoConfiguration 这个配置类才会被执行,它的配置才会生效。
6、自动装配总结
1)每一个 XxAutoConfiguration类 中都有很多条件注解( @ConditionalOnXxx ),当这些条件都满足时,此配置会自动装配生效(如:HttpEncodingAutoConfiguration类)。我们也可以手动修改 这些配置,我们要在 XxxProperties文件 中的找到 prefix 和 对应的 属性名。(key的基本格式是:prefix.属性名=value
)
2)全局配置文件中的 key,是来源于某个 XxxProperties文件 中的 prefix.属性名
。如果您想知道该 Spring Boot 项目中开启了哪些自动装配、禁止了哪些自动装配,只需要在 application.properties文件 中 配置:debug=true
。我们在开启项目后,会在控制台打印出装配的配置信息,其中 Positive matches 表示这个列表自动开启的装配,Negative matches 表示此时并没有启用的装配。
四、本篇总结
在我们以前编写项目时,一般会 对自己写的代码 以及 三方依赖 进行配置。而 Spring Boot 可以对我们一些常规的配置进行自动配置,主要实现全靠 @SpringBootApplication注解。
1、自己写的代码
我们自己写的代码,可以通过 @SpringBootConfiguration注解 进行 Spring Boot 自动配置;
2、三方依赖
三方依赖,我们也可以通过 spring-boot-autoconfigure-2.1.7.RELEASE.jar 中的 META-INF/spring.factories 文件,然后通过 @EnableAutoConfiguration注解 开启使用即可。spring-boot-autoconfigure-2.1.7.RELEASE.jar包 中包含了整个 J2EE 整合体系中所需要的依赖。