SpringBoot构建微服务实战 之 @Import

SpringBoot构建微服务实战 之 @Import

SpringBoot 的 @Import 用于将指定的类实例注入之Spring IOC Container中。
SpringBoot 提供了 三种使用 @Import 将 类实例注入至 Spring IOC Container中 的实例。

  • 直接注入
  • 实现 ImportBeanDefinitionRegistrar 接口 注入
  • 实现 ImportSelector 注入

  • 直接注入

    • Broker.java(无任何属性和实现)

      package com.springBoot.entrance.importBean.direct;
      
      public class Broker {
      
      }
      
    • Customer.java(无任何属性和实现)

      package com.springBoot.entrance.importBean.direct;
      
      public class Customer {
      
      }
      
    • ImportDirect.java

      package com.springBoot.entrance.importBean.direct;
      
      import org.springframework.context.annotation.Import;
      import org.springframework.stereotype.Component;
      
      
      @Component
      @Import({Customer.class,Broker.class})
      /**
       *使用Import 将指定的类的实例注入至Spring 容器中
       */
      public class ImportDirect {
      
      }

      代码解读:使用 @Import({Customer.class,Broker.class}) 后 Customer 和 Broker类的实例将会被注入之Spring IOC Container中

    • App.java

      //import Direct 使用import 直接将指定的类实例注入至Spring 容器中
              System.out.println(context.getBean(ImportDirect.class));
              System.out.println(context.getBean(Customer.class));
              System.out.println(context.getBean(Broker.class));
    • 结果
      SpringBoot构建微服务实战 之 @Import_第1张图片


  • 实现 ImportBeanDefinitionRegistrar 接口 注入

  • Forwards.java(无任何属性和实现)

    package com.springBoot.entrance.importBean.indirectImportBeanDefinitionRegistrar;
    
    public class Forwards {
    
    }
    
  • Security.java(无任何属性和实现)

    package com.springBoot.entrance.importBean.indirectImportBeanDefinitionRegistrar;
    
    public class Security {
    
    }
    
  • MyImportBeanDefinitionRegistrar.java

    package com.springBoot.entrance.importBean.indirectImportBeanDefinitionRegistrar;
    
    import org.springframework.beans.factory.support.BeanDefinitionBuilder;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * registerBeanDefinitions 方法中的参数 BeanDefinitionRegistry 可以往Spring IOC Container 中动态地装配Bean
     */
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
            //手动注入 Forwards 类的实例
            BeanDefinitionBuilder beanDef_forwards = BeanDefinitionBuilder.rootBeanDefinition(Forwards.class);
            registry.registerBeanDefinition("forwards", beanDef_forwards.getBeanDefinition());
    
            //手动注入 Security类的实例
            BeanDefinitionBuilder beanDef_security = BeanDefinitionBuilder.rootBeanDefinition(Security.class);
            registry.registerBeanDefinition("security", beanDef_security.getBeanDefinition());
        }
    
    }
    
  • App.java

    @Import(MyImportBeanDefinitionRegistrar.class)
    @Configuration
    public class App {
    
    
        public static void main(String[] args) throws Exception {
            ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
    
            //实现ImportBeanDefinitionRegistrar 实现Bean的注入
            System.out.println(context.getBean(MyImportBeanDefinitionRegistrar.class));
            System.out.println(context.getBean(Forwards.class));
            System.out.println(context.getBean(Security.class));
    
        }
    
    
    }
    

  • 实现 ImportSelector 注入

    请参考 SpringBoot构建微服务实战 之 @Enable*

你可能感兴趣的:(SpringBoot)