-
SpringBoot自动装配-自定义Start
SpringBootApplication注解
什么是自动装配,也就是说帮你把需要的类自动添加到Spring容器中
只要是一个SpringBoot项目肯定有这样一个类
而自动装配是在@SpringBootApplication
这个注解中实现的,点进去首先能看到这个注解上还有三个注解
其中SpringBootConfiguration上还有一个注解@Configuration
也就是说明其实SpringBootApplication也是一个配置类
@ComponentScan用于扫描需要被Spring管理的类,这也就是为什么写的类需要在SpringBoot启动类同级或在同级下的子包中
@EnableAutoConfiguration点进去发现它上面有一个特殊的注解@Import(AutoConfigurationImportSelector.class)
@Import注解的作用是将指定类添加到Spring容器中成为一个Bean
而在AutoConfigurationSelector类中有自动装配的实现
其中我们关注与返回值相关的代码,也就是getCandidateConfigurations这个方法
继续查看loadFactoryNames方法
其中需要解释一下的是:MultiValueMap[接口],它是一个特殊的Map,由SpringBoot自己写的,查看它的实现类LinkedMultiValueMap
通常我们使用的Map是一个<K,V>结构的,而它这个Map是一个<K,V V V ...>结构的
首先SpringBoot会从缓存中尝试获取(其实也就是个map,不过有点特殊),如果获取不到,那就一次将全部内容读取出来,然后以K V V V...的形式存放到类中
那么META-INF/spring.factories这个文件在哪呢?
它里面的内容是这样的
以类的全限定名作为Key,其他类的全限定名作为Value
那到现在还是一头雾水,读到了这个有什么用呢?我们拿常见的Redis来看看
点进RedisAutoConfiguration看看
发现里面全是报错,因为我还没有导入Redis的start,当我在pom文件中添加redis的依赖后
发现不报错了,使用RedisTemplate存取值也可以了,这里就不再演示存取值
上面这个类主要看类上面的注解,主要的两个为:ConditionalOnClass
和EnableConfigurationProperties
ConditionalOnClass
@ConditionalOnClass
的作用是当前项目的classpath中存在某个类在会实例化这个类为bean,Spring还提供了其他类似的注解
那么毫无疑问pom中导入的那个依赖中肯定有一个类或接口叫做RedisOperations
,点进去查看它的包路径
package org.springframework.data.redis.core;
我们去导入的包中找一找
EnableConfigurationProperties
@EnableConfigurationProperties
注解是使@ConfigurationProperties
注解的类生效,点进注解上的类
@ConfigurationProperties
注解的作用是可以将参数的配置设置在application配置文件中,我们在application配置文件中配置的参数都配置类中的字段,要不然这些参数那来的?
那么现在SpringBoot自动装配的大致流程就完成了
- 读取META-INF/spring.factories文件
- 将扫描出的类进行判断
-
如果符合类上的
@ConditionalOnxxxx
注解就将类添加到Spring容器中
如何自定义一个Start
现在知道了SpringBoot是如何自动装配的,扫描MEAT-INF下spring.factories文件,key为:EnableAutoConfiguration,为什么key为EnableAutoConfiguration呢?在上面的代码中,扫描的以@EnableAutoConfiguration注解获取名称作为key
首先创建一个Maven项目,导入依赖
之后在resources文件夹下创建META-INF/spring.factories文件
然后创建配置类 当代码没有写完时@ConfigurationProperties会报错:没有开启这个配置类,可以暂时不管
创建服务类
创建自动注入的配置类
最后在spring.factories中添加自动装配类
整个项目结构如下
最后将maven项目 clean install 打包到当前maven仓库中
在target输出文件夹下打开cmd 直接在路径框中输入cmd直接打开当前位置
输入命令
mvn install:install-file -Dfile=start-user-1.0-SNAPSHOT.jar -DgroupId=com.jame -DartifactId=user-spring-boot-start -Dversion=1.0 -Dpackaging=jar
- -Dfile 文件名
- -DgroupId 就是groupId
- -DartifactId 项目名称,可以不和文件名一样
- -Dversion 版本号
- -Dpackaging打包方式
完成后新建个SpringBoot项目来测试
导入刚才打包的项目
配置参数
创建一个Controller来测试
这里使用@Autowired idea可能会提示错误,说找不到对应的类型,这个是idea的问题
如果不想看着难受可以设置:Setting->Editor->inspections->Spring Core->Core->AutoWring for bean class 将Error设置为Waring
最后访问测试:
__EOF__