美文网首页
Spring 使用 @Import 的好处是啥?

Spring 使用 @Import 的好处是啥?

作者: hemiao3000 | 来源:发表于2022-01-15 17:56 被阅读0次

    Spring 往 IOC 中添加组件的方式,你知道几种呢?

    可能你只知道 @ComponentScan + @Controller + @Service @Respository + @Component

    还知道 @Bean 。但是如果你不知道 @Import 的话,你肯定没有看过其他框架的源码!

    那下面我们来罗列有哪些添加组件的方式?

    1. 通过 @CompentScan + @Controller/@Service/@Respository/@compent

      适合场景:我们自己写的组件可以通过这种方式来进行加载到容器中。

    2. 通过 @Bean 的方式来导入组件

      适合场景: 适用于导入第三方组件的类

    3. 通过 @Import 来导入组件

      适合场景:导入组件的 id 为全路径,用处最多的是其他框架整个 Spring 时,使用 @Import 注解导入整合类。

    代码演示

    前两个就不演示了,我们演示『@Import 注解』的使用

    1. 注解导入需要初始化的类

      @Import (value = {Person.class, Car.class})
      
    1. 实现 ImportSelector 接口,在接口中返回id的全路径

      public class HelloImportSelector implements ImportSelector { 
          @Override 
          public String[] selectImports(AnnotationMetadata importingClassMetadata) { 
                  return new String[]{"com.xx.testimport.compent.Person"}; 
          } 
      } 
      
      @Configuration 
      @Import(value = {HelloImportSelector.class}) 
      @ComponentScan(basePackages ={"com.xx.testimport.scanner"}) 
      public class MainConfig { 
      }
      
    运行后 Person 就会被加载到 Spring 容器中。
    
    1. 实现 ImportBeanDefinitionRegistrar 接口

      class XxxBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
          @Override 
          public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
              RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person.class);   
              registry.registerBeanDefinition("person",rootBeanDefinition); 
          } 
      } 
      
      @Configuration 
      @Import(value = { XxxBeanDefinitionRegister.class})
      @ComponentScan(basePackages ={"com.xxx.testimport.scanner"}) 
      public class MainConfig { 
      }
      

    Spring 往 IOC 中添加组件的方式有以上三种方式。

    相关文章

      网友评论

          本文标题:Spring 使用 @Import 的好处是啥?

          本文链接:https://www.haomeiwen.com/subject/vudacrtx.html