前言

提到SpringBoot大家都不陌生,但是在有没有思考过在开发时写好自己的组件后,需要用到@Autowired或者是@Resource来进行注入才能用,有时候还会出现很多问题,比如重复注入、注入失败等等。想想就头大。但是SpringBoot依赖中的组件,为什么就能拿来直接用呢?

1、@SpringBootApplication 注解

这个注解想必用过SpringBoot的人都不陌生,是写在启动类上的注解。其实自动装配也要从这个说起。

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_自动装配

 可以看到这个注解是一个复合注解,其实里面核心的注解有三个,分别是@ComponentScan、@SpringBootConfiguration还有@EnableAutoConfiguration 。

2、@ComponentScan注解

这个注解看名字就知道,是包扫描注解。扫描的是启动类所在的包,以及他的子包能被spring扫描到,而启动类所在包外面的类就无法扫描到了

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_spring boot_02

 所以如果我把一个类定义在这里,那么无论写什么注解,spring都无法扫描到并将实例加入Ioc容器中。

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_反斜杠_03

 3、@SpringBootConfiguration注解

这个注解的作用就是告诉spring,这个类是一个配置类,同样会被spring所管理,且如果这个类中有@Bean之类的组件,会将实例加载到Ioc容器中。比如这样。

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_自动装配_04

 4、@EnableAutoConfiguration注解

这个注解就是实现自动装配的核心注解了,其底层的大致原理就是:首先通过反射,找到依赖包的resource资源目录,然后找到他下面的META-INF包,在读取里面的spring.factories文件,到这里的操作和文件名都是固定的,必须按照spring的要求写才行。

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_java_05

 然后就是这个配置文件中的这个配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration

这个配置项就是用来指定要实现自动装配的类在哪里,把类的全路径写在=号后面,记得一定要加一个反斜杠,注意!是反斜杠。比如我这么写,spring就会通过反射找到配置的这个类,然后读取类中的实例项,加载到Ioc容器。

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_自动装配_06

例如这样

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_反斜杠_07

 

 带有@Bean注解的实例就被自动装配到Ioc容器里面了

截止到这里一个starter的基本原理就说完了,一个最基本的starter也就写完了。

5、starter的使用

那么属于自己的starter写好了之后,怎么用呢?

首先第一步,引入我们写好的starter的依赖

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_spring_08

第二步,注入我们设置好的、自动装配的对象

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_java_09

第三步,通过Postman测试工具,访问写好的这个方法

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_spring_10

第四步,得到结果,发现Ioc中这个User实例就是我们配置的自动装配进去的张三

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_spring_11

为啥创建的SpringBoot项目String类不自动导入 springboot不能自动装配_反斜杠_12

 6、总结

现在一个starter就开发完了,希望各位已经清楚了SpringBoot的自动装配原理,开发出属于自己的starter。觉得有用的观众姥爷不妨点个赞支持一下吧~ 0.o