SpringBoot入门学习笔记四(@SpringBootApplication注解)

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/103026876







本篇主要来讲解 @SpringBootApplication注解,本篇没有具体示例,只是简单的理论介绍,初学者了解即可。

我们一般将被 @SpringBootApplication注解 修饰的类称之为是 Spring Boot 的主配置类Spring Boot 之所以能提供强大的功能,全是因为依赖了这个注解。我们开启项目就是从主配置类中的 main方法 开启的,所以主配置类配置的一切信息,都是对整个项目的配置。

这个注解中包含了很多子注解,我们今天就来主要看一下 @SpringBootConfiguration@EnableAutoConfiguration 这两个注解。

@SpringBootApplication注解

@SpringBootApplication注解结构


一、@SpringBootConfiguration注解

@SpringBootConfiguration注解 是 Spring Boot 的配置类注解

在这个注解中包含一个非常重要的注解 —— @Configuration注解,被 @Configuration注解 修饰的类 表示 “配置类”

我们以前写的 “配置文件” 可能在大型项目中配置项会过于庞大,而为了解决这个问题,Spring Boot 更推荐我们使用 “配置类” 来代替 “配置文件”

加了 @Configuration注解 的类,会自动纳入到 Spring容器 中。(通过源码得知:在 @Configurtion注解 中包含了 @Component@Component注解 表示交由 Spring 进行管理】)

// 表示 A 这个类是一个用于 配置的类
@Configuration
public class A {
	// ...
}

@SpringBootConfiguration注解一

@SpringBootConfiguration注解二



二、@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);
	}
}

@AutoConfigurationPackage注解

spring.factories文件



三、如何实现自动装配?(以 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)中来手动来修改配置,如下图:

application.properties文件

注意: 通过此配置可以将整个项目的字符集编码设置成 UTF_16,可能有小伙伴有疑问,字符集编码的 key (spring.http.encoding.charset)能否修改呢?答案是不可以的。因为在 Spring Boot 中早已规定好了这个 key 的名字,我们可以进入 @EnableConfigurationProperties注解 中的参数 HttpProperties类 的源码中找到这个key的名字(@ConfigurationProperties注解中的 prefix参数),如下图:

HttpProperties类

HttpProperties类2

从上图可以看出,key 名字的基本格式是:prefix.属性名。而在字符集中 prefix 的值是 spring.http,属性名是 encoding对象 中的 charset,连起来就是: spring.http.encoding.charset

而具体的值,我们可以通过 StandardCharsets类 的源码得知,字符集编码的可选值有: US_ASCIIISO_8859_1UTF_8UTF_16BEUTF_16LEUTF_16

StandardCharsets类


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 表示此时并没有启用的装配。

debug1

debug2



四、本篇总结

在我们以前编写项目时,一般会 对自己写的代码 以及 三方依赖 进行配置。而 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 整合体系中所需要的依赖。



博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



发布了166 篇原创文章 · 获赞 169 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/103026876