- 自动装配的实现
- 自定义Starter组件
1.自动装配的实现
1.1 定义要自动装配的类
1.2 创建实现ImportSelector接口的类,重写selectImports方法,该方法返回的类名会被自动装配到IoC中
1.3 自定义一个注解
1.4 从容器中获取Bean
1.5 简单看下Spring Boot启动类自动装配的实现
创建两个类:
public class FirstClass{}
public class SecondClass{}
创建一个ImportSelector的实现类
public class GpImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{FirstClass.class.getName(),SecondClass.class.getName()};
}
}
自定义一个注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({GpImportSelector .class})
public @interface EnableAutoImport {}
在启动类中获取Bean
@SpringBootApplication
@EnableAutoImport
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ca=SpringApplication.run(DemoApplication.class, args);
FirstClass fc=ca.getBean(FirstClass.class);
System.out.println(fc.getClass().getName());
}
}
下面让我们看下Spring Boot自动装配的实现
Spring Boot中自动装配是通过@EnableAutoConfiguration注解来开启的
定位到AutoConfigurationImportSelector中的selectImports方法,它是ImportSelector接口的实现,这个方法中主要有两个功能
- getAutoConfigurationMetadata函数中的AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
是从classpath下的META-INF/spring-autoconfigure-metadata.properties中加载自动装配的条件元数据,就是只有满足条件的Bean才能够进行装配 - autoConfigurationEntry.getConfigurations()收集所有符合条件的配置类
先获得所有的配置类,再通过其他乱七八糟的筛选去重、排除等操作得到最终需要实现自动装配的配置类
如果仔细看里面的方法会发现SpringFactoriesLoader,它是Spring内部提供的一种约定俗成的加载方式,它会扫描classpath下META-INF/spring.factories文件
该文件中的数据以Key=Value形式存储,而SpringFactoriesLoader.loadFactoryNames会根据Key得到对应的Value值,也就是配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,
org.sprignframework.boot.autoconfigure.aop.AopAutoConfiguration,
//省略
Listconfigurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
总结一下核心过程:
1.通过@Import({AutoConfigurationImportSelector.class})实现配置类的导入,但是这里并不是传统意义上的单个配置类装配
2.AutoConfigurationImportSelector类实现了ImportSelector接口,重新selectImports,用于实现选择性批量配置类的装配
3.通过Spring提供的SpringFactoriesLoader机制,扫描classpath下META-INF/spring.factories读取需要实现自动装配的配置类
4.通过条件筛选把不符合条件的配置类移除,最终完成自动装配
2.实现一个Starter组件
1.Starter组件主要有三个功能: 涉及组件的相关Jar包依赖、自动实现Bean的装配、自动声明并加载application.properties文件中的属性配置
2.Starter的命名:
官方命名格式:spring-boot-starter-模块名称
自定义命名格式:模块名称-spring-boot-starter
具体实现以自定义一个redis的strter组件:
1.目录结构
2.添加依赖
3.redis连接相关属性类
4.自动装配Bean类
5.创建META-INF/spring.factories文件,内容如下
6.在pom.xml文件中设置groupId artifactId version
7.编译文件生成jar包,并将其添加到本地的maven仓库来测试验证