Spring Boot:自动装配实现和自定义Starter组件

  1. 自动装配的实现
  2. 自定义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注解来开启的
Spring Boot:自动装配实现和自定义Starter组件

定位到AutoConfigurationImportSelector中的selectImports方法,它是ImportSelector接口的实现,这个方法中主要有两个功能

  1. getAutoConfigurationMetadata函数中的AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
    是从classpath下的META-INF/spring-autoconfigure-metadata.properties中加载自动装配的条件元数据,就是只有满足条件的Bean才能够进行装配
  2. 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,
    //省略
    List configurations = 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.目录结构
Spring Boot:自动装配实现和自定义Starter组件

2.添加依赖
Spring Boot:自动装配实现和自定义Starter组件

3.redis连接相关属性类
Spring Boot:自动装配实现和自定义Starter组件

4.自动装配Bean类
Spring Boot:自动装配实现和自定义Starter组件

5.创建META-INF/spring.factories文件,内容如下
Spring Boot:自动装配实现和自定义Starter组件

6.在pom.xml文件中设置groupId artifactId version
Spring Boot:自动装配实现和自定义Starter组件

7.编译文件生成jar包,并将其添加到本地的maven仓库来测试验证

上一篇:微信小程序 auth.getAccessToken 获取access_token JAVA


下一篇:js sort()方法改变原数组了怎么办