⑴ SpringBoot的自动装配(一)
一、什么是SpringBoot的自动装配
SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。
自动的表现形式就是我们只需要引我们享用功能的包,其他的配置完全不需要管,springboot会自动注入这些配置备案,我们直接使用就行。
自动装配也是SpringBoot的一个重要的特点,他帮我们做了很多的配置。
二、它是怎样实现的?
1、run方法
当启动一个SpringBoot项目时,本质上就是执行了地洞累中的主方法,然后执行了run方法。
这个对象就是 ApplicationContext接口的一个子接口。
其实SpringBoot项目的启动,本质上就是一个Spring的初始化操作。
2、@SpringBootApplication
点开这个注解可以发现,这是一个组合注解,包括:
这些注解中,前四个是JDK中的自动元注解,是用来修饰注解的注解。@ComponentScan是用来扫描路径的,如果不置顶特定的扫描路径的话,扫描的路径是当前修饰的类所在的包及其子包。而@SpringBootConfiguration这个注解的本质就是@Configuration注解。所以在这里面跟SpringBoot自动装配有关系的就只有一个了:@EnableAutoConfiguration
3、@EnableAutoConfiguration
@AutoConfigurationPackage不是用来实现自动装配的,在Spring中,他是用来扫描实体类Entity等注解的。所以重点是在@Import上。
@Import注解实现了类,自动装配也是在这个类中进行了具体的实现。自动装配实现的就是该类中的selectImports方法里。通过selectImports方法,取到spring.factories文件下的一系列类名,随后将这些类自动加载至IOC容器中。
4、总结
SpringBoot的自动装配也就是通过@EnableAutoConfiguration注解,加载类中的selectImports方法,进而扫描spring.factories文件下的自动配置类,并将其装配到IOC容器的过程。
⑵ 你所理解的SpringBoot的自动配置是什么
SpringBoot采用**约定大于配置设计思想**,将所有可能遇到的配置信息提前配置好,写在自动配置的jar包中。每个Starter基本都会有对应的自动配置。
这意味着:日后我们在开发Spring应用程序的过程中,需要的配置项,由Pivotal团队的开发人员,帮我们写好了。怎么实现的?主要是通过@Configuration声明的配置类来实现。
SpringBoot帮我们将配置信息写好,存放在一个jar包中:spring-boot-autoconfigure-2.1.11.RELEASE.jar,jar包里存放的都是配置类,以及让配置类生效的"规则类"。
自动配置是SpringBoot中比较深奥的内容,相信你看完我的解释,肯定懵懵懂懂;就去黑马程序员官网视频库看免费视频。
⑶ SpringBoot入门-自动配置详解
通过查看SpringBootApplication的源码,会发现这是一个组合注解,其中最重要的注解是@EnableAutoConfiguration
先看@AutoConfigurationPackage这个注解
里面导入了一个Registrar类,这个类实现了bean的扫描与注册,那它扫描的是哪个包呢?
只要看PackageImports这个类,会发现如果没有用@ComponentScan指定包名,他默认扫描的是启动类的包名,比如你的启动类是cn.hollycloud.App,它扫描的就是cn.hollycloud
再来看这个类,这个类用来加载所有的自动配置项
通过上面的源码我们知道spring把所有配置项都导进来了,但我们并不需要所有的功能。比如说我开发的时候并不需要mongodb相关功能,但spring也会把相关配置项加载进来,怎么关闭该功能呢?看下mongodb的自动配置源码
重点是@ConditionalOnClass(MongoClient.class),这个的意思是只有类路径中存在MongoClient.class,也就是我们导入mongo相关依赖,这个配置项才会开启,否则不会注册这个bean。
同时我们看下面有个MongoClient的bean,spring很贴心地为我们初始化好了mongo的客户端,我们直接使用就行了,如果想自定义客户端怎么办呢?也很简单,直接自己初始化一个mongo客户端放入spring容器就行了,@ConditionalOnMissingBean的意思是如果你没有自定义客户端它才会自己生成一个,是不是很方便,这个叫条件化注解
现在我们来实现一个简单的自动配置类来巩固下。
可以想象一下我们是一家机器人公司,专门制造高端机器人,很受客户欢迎,但是配置机器人过于复杂,这点老是被客户诟病,你的领导想让你提供给客户开机即用的产品,该如何实现呢?
首先我们创建一个机器人控制终端,这是控制终端可以操控机器人说话
接下来是自动配置项,可以自动注册配置终端
我们想要给客户一点自由,可以让客户自由配置机器人的名字和颜色,而不用管机器内部复杂的操作
接下来最重要的一步是把自动配置项放到类路径的/META-INF/spring.factories里面
然后客户直接引用你提供的依赖就能直接控制机器人了,而不用管复杂的初始化操作
来控制机器人说话吧,直接注入robot就能使用了,不需要客户关心复杂的初始化操作了
如果客户想为机器人改个名字也很简单,直接在application.yml配置下就行了
这个例子虽然很简单,但是说明了自动配置的工作原理,spring内置的自动配置虽然复杂,但原理都一样的。
参考代码: https://gitee.com/huatin/java-test 下的AutoConfigTest模块