从零开始的Spring Boot学习【四】【自动装配(三)】

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

我们得知了Spring配置的第三方jar包都在如上的这个路径被引用,那么我们就去找到这个文件,看看它里面到底写了什么东西。

我们之前已经打开过了Maven Dependencies,在里面找到了有关Spring Boot的管理配置的jar包,在这个jar包中存放了很多package和很多class文件,我们移动到最下方,我们会找到了META-INF

在META-INF文件夹中,果然有一个spring.factories,我们打开这个文件。

会发现这是一个存放了第三方各种依赖的工厂,里面包含了各种jar的名字,引用这个文件就可以获取第三方jar的相关信息。Spring Boot在启动时,会根据META-INF/spring.factories找到相应的三方依赖,并将这些依赖引入本项目,在上方的package中,都能找到与之对应的名字,也就是说jar包提供了具体的类,也提供了相应的配置文件

那么多的jar包,难道我们全部都引用到了项目中吗?像我这个只是一个最基本的Spring Boot的demo,输出一句简单的hello world,根本不需要那么多的jar包,一次性引用那么多没有用到的依赖,使得项目体积变大,造成了不必要的浪费,所以Spring Boot并不会一次性让所有的依赖注入到项目中,而是在你有需求的时候,才会把开启自动装配。如何实现的呢?

首先我们先回到之前配置了编码格式的jar包中去,在Maven Dependencies的上述位置,我们点击进去看看源码。

@Configuration和@EnableConfigurationProperties我们之前已经讲过哩,忘记了的童鞋或者没有看的同学请看我之前所写的文章,下方有链接哦。我们来说下它是如何实现当需要时才去注入到项目中。我用红色笔框起来的三个部分就是关键因素,Conditional是条件的意思,on:当什么的时候,也就是说当满足on后面的条件的时候,我们就会注入相关的依赖(开启自动装配)。上述的意思可查:

也就是说只有三个条件都满足了,Spring Boot才会自动去执行下面的这个代码(注入依赖)。

那么我们难道要每一个类都要这样去找,判断它是不是条件满足吗?当然不用,Spring Boot提供了一个方法可以快速知晓到底注入了哪些依赖。

我们在配置文件中输入这么一句话debug=true。然后我们运行一次程序看看。

上述Positive matches是匹配到的jar包,即已经注入依赖的。

Negative matches是没有匹配到的jar包,即没有注入的依赖。

即debug是生成了一个报告,告诉我们哪些开启了,哪些没有开启。

我们来总结一下:

编写项目时,一般会对自己写的代码以及 三方依赖 进行配置。但是Spring Boot可以自动进行配置:
 

a:自己写的代码,Spring Boot通过@SpringBootConfiguration自动帮我们配置。
b. 三方依赖通过spring-boot-autoconfigure-X.X.X.RELEASE.jar中的META-INF/spring.factories进行声明。
然后通过@EnableAutoConfiguration开启使用即可。
(spring-boot-autoconfigure-X.X.X.RELEASE.jar包中包含了J2EE整合体系中 需要的依赖)。
c.如何自动装配:研究org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\。
通过观察该源码 发现:@Configuration:标识此类是一个配置类 ,将此类纳入springioc容器。


@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true),当属性满足要求时,此条件成立  :要求 如果没有配置spring.http.encoding.enabled=xxx, 则成立。

1.每一个XxAutoConfiguration 都有很多条件@ConditionalOnXxx。
当这些条件都满足时,则此配置自动装配生效(utf-8)。
但是我们可以手工修改改 自动装配: XxxProperties文件中的prefix.属性名=value。

2.如何知道Spring Boot开启了哪些自动装配、禁止了哪些自动装配: application.properties中输入debug=true。
Positive matches列表表示Spring Boot自动开启的装配。
Negative matches列表表示Spring Boot在此时并没有启用的自动装配。

上一章:从零开始的Spring Boot学习【三】【自动装配(二)】

下一章:从零开始的Spring Boot学习【五】【配置文件及yml使用】

发布了28 篇原创文章 · 获赞 29 · 访问量 8337

猜你喜欢

转载自blog.csdn.net/KnightHONG/article/details/104173370