SpringBoot Import及自定义装配实现方法解析

 更新时间:2020年08月19日 09:07:42   作者:emdzz  
这篇文章主要介绍了SpringBoot Import及自定义装配实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Import的注册形式:

1、使用@Import导入一个或者多个类字节对象

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
  Class<?>[] value();
}

使用时一般在配置类上注解,表示该注解类导入了其他配置

@Configuration
@Import({
    MyBeanFactoryPostProcessor.class,
    ClassA.class,
    ClassB.class,
    ClassC.class
})
public class TestConfiguration {
}

2、使用导入Bean定义登记者

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(ClassD.class);
    registry.registerBeanDefinition("classD", rootBeanDefinition);
  }
}

然后配置导入:

@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class TestConfiguration {
}

测试运行:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class DefinitionTest {
  @Autowired
  private ClassD classD;

  @Test
  public void testSample() {
    System.out.println(classD);
  }
}

cn.dzz.bean.ClassD@6771beb3

Process finished with exit code 0

3、使用【导入选择器】

原始版本是直接声明类完整路径名

public class MyImportSelector implements ImportSelector {

  public String[] selectImports(AnnotationMetadata annotationMetadata) {
    return new String[] {"cn.dzz.bean.ClassD"};
  }
}

导入配置:

@Configuration
@Import(MyImportSelector.class)
public class TestConfiguration {
}

测试结果:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class DefinitionTest {
  @Autowired
  private ClassD classD;

  @Test
  public void testSample() {
    System.out.println(classD);
  }
}

cn.dzz.bean.ClassD@682b2fa

Process finished with exit code 0

第二版本,类的限定名固定编写在源码文件中不可灵活改变:

我们可以通过外部的配置文件来实现:

1、创建配置读取类

public class Tc51AutoConfigReader {
  public static Properties readerProperties(String resource){
    Properties properties = new Properties();
    InputStream it = Tc51AutoConfigReader.class.getResourceAsStream(resource);
    try {
      properties.load(it);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return properties;
  }
}

2、获取字符串,但是这个方法写的非常简单,只读取了一个类

我们的一个Map是允许一个键存储多个值的,也就是读取多个类

public String[] selectImports(AnnotationMetadata annotationMetadata) {
  Properties properties = Tc51AutoConfigReader.readerProperties("/Tc51autoconfig.properties");
  String property = properties.getProperty(Tc51EnableAutoConfig.class.getName());
  return new String[]{property};}

第三版本,调用Spring写好的方法和注解方式实现自动装配

首先仿照SpringBoot创建这样的配置文件:

内部配置信息:

cn.dzz.annotation.MyEnableAutoConfiguration = \
cn.dzz.config.RedisConfiguration

声明一个自定义开启自动配置注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyImportSelector.class)
public @interface MyEnableAutoConfiguration {
}

然后实现导入选择器接口的方法变成这样:

public class MyImportSelector implements ImportSelector {

  private Class<?> getMyFactoryLoaderClass(){
    return MyEnableAutoConfiguration.class;
  }

  private List<String> getConfiguration(){
    return SpringFactoriesLoader.loadFactoryNames(
      getMyFactoryLoaderClass(),MyImportSelector.class.getClassLoader()
    );
  }

  public String[] selectImports(AnnotationMetadata annotationMetadata) {
    return StringUtils.toStringArray(getConfiguration());
  }
}

首先是得到注解类的字节对象,它被下面的方法所需要,

获取配置方法可以从配置文件中读取信息返回一个List集合,里面装载了那些类限定名(配置信息)

需要的参数是上面写的注解类字节对象和一个类加载器

再返回给选择器方法,集合转换一下数组即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Java如何通过Socket实现查询IP

    详解Java如何通过Socket实现查询IP

    在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API,感兴趣的可以了解一下
    2022-10-10
  • Java导出Excel文件的方法

    Java导出Excel文件的方法

    项目里很多接口都涉及导出Excel文件,所以本文给大家总结了项目中导出Excel文件的方法,并通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2025-02-02
  • 字符编码的处理和BeanUtils组件使用详解

    字符编码的处理和BeanUtils组件使用详解

    这篇文章主要为大家介绍了字符编码的处理和BeanUtils组件的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java 输入多行字符串或者多个int数值的方法

    Java 输入多行字符串或者多个int数值的方法

    今天小编就为大家分享一篇Java 输入多行字符串或者多个int数值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springboot如何为web层添加统一请求前缀

    springboot如何为web层添加统一请求前缀

    这篇文章主要介绍了springboot如何为web层添加统一请求前缀,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Postman form-data、x-www-form-urlencoded的区别及说明

    Postman form-data、x-www-form-urlencoded的区别及说明

    这篇文章主要介绍了Postman form-data、x-www-form-urlencoded的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • SpringBoot项目中如何解决跨域问题的最新方案?

    SpringBoot项目中如何解决跨域问题的最新方案?

    跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-Origin Policy),即只允许页面请求同源(相同协议、域名和端口)的资源,当 JavaScript 发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收
    2025-03-03
  • Java package编译乱码问题解决

    Java package编译乱码问题解决

    这篇文章主要介绍了Java package编译乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java并发编程之原子性、可见性、有序性

    java并发编程之原子性、可见性、有序性

    这篇文章主要给大家分享的是java并发编程的原子性、可见性和有序性,文章会具体举例说明,感兴趣的小伙伴可以参考一下文章的具体内容
    2021-09-09
  • Java快速排序QuickSort(实例)

    Java快速排序QuickSort(实例)

    下面小编就为大家带来一篇Java快速排序QuickSort(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论