Spring註解編程(三)---註解配置給IOC容器添加組件方式

1.@Configuration&@Bean給容器中註冊組件

//配置類==配置文件
@Configuration  //告訴Spring這是一個配置類
public class MainConfig {

   //給容器中註冊一個Bean;類型爲返回值的類型,id默認是用方法名做爲id
   @Bean("person")
   public Person person01(){
      return new Person("lisi", 20);
   }

}

 

2.@ComponentScan-自動掃描組件

這個就是相似在xml文件中添加的掃描的註解linux

@ComponentScan("com.lemon.bean")
@Configuration
public class MainConfig {


}

@Component   將當前類聲明爲IOC容器中的一個普通的組件(除了下面三種外的組件)
@Controller   將當前類聲明爲IOC容器中的一個控制器組件
@Service    將當前類聲明爲IOC容器中的業務邏輯層組件
@Repository    將當前類聲明爲IOC容器中的一個持久化層組件spring

@ComponentScan指定的包路徑下標註了以上註解的組件都會添加到IOC容器中數組

3.@Conditional-按照條件註冊

Conditional註解在springBoot底層中大量用到的註解,很是的重要,瞭解這個註解對理解SpringBoot自動裝配原理會更深,下面是實現一個若是操做系統時Linux時就添加person實例到容器app

@Configuration  //告訴Spring這是一個配置類
public class MainConfig {

   @Conditional(LinuxCondition.class)
   @Bean("linus")
   public Person person02(){
      return new Person("linus", 48);
   }

}
public class LinuxCondition implements Condition {


   @Override
   public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

      ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();

      ClassLoader classLoader = context.getClassLoader();

      Environment environment = context.getEnvironment();

      BeanDefinitionRegistry registry = context.getRegistry();

      String property = environment.getProperty("os.name");

      boolean definition = registry.containsBeanDefinition("person");
      if(property.contains("linux")){
         return true;
      }

      return false;
   }

}

4.@Import-給容器中快速導入一個組件

@Import快速給容器添加組件有三種方式 ide

@Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
   
}

1)、@Import(要導入到容器中的組件);容器中就會自動註冊這個組件,id默認是全類名spa

如上直接添加Color.class,Red.class操作系統

2)、實現ImportSelector:返回須要導入的組件的全類名數組.net

public class MyImportSelector implements ImportSelector {

   //返回值,就是到導入到容器中的組件全類名
   //AnnotationMetadata:當前標註@Import註解的類的全部註解信息
   @Override
   public String[] selectImports(AnnotationMetadata importingClassMetadata) {
      // TODO Auto-generated method stub
      //importingClassMetadata
      //方法不要返回null值
      return new String[]{"com.lemon.bean.Blue","com.lemon.bean.Yellow"};
   }

}

方法不能返回null 不然會報空指針異常錯誤指針

3)、實現ImportBeanDefinitionRegistrar接口:手動註冊bean到容器中xml

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

   /**
    * AnnotationMetadata:當前類的註解信息
    * BeanDefinitionRegistry:BeanDefinition註冊類;
    *        把全部須要添加到容器中的bean;調用
    *        BeanDefinitionRegistry.registerBeanDefinition手工註冊進來
    */
   @Override
   public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

      boolean definition = registry.containsBeanDefinition("com.lemon.bean.Red");
      boolean definition2 = registry.containsBeanDefinition("com.lemon.bean.Blue");
      if(definition && definition2){
         //指定Bean定義信息;(Bean的類型,Bean。。。)
         RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
         //註冊一個Bean,指定bean名
         registry.registerBeanDefinition("rainBow", beanDefinition);
      }
   }

}

5.實現FactoryBean接口註冊組件

//建立一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

   //返回一個Color對象,這個對象會添加到容器中
   public Color getObject() throws Exception {
      // TODO Auto-generated method stub
      System.out.println("ColorFactoryBean...getObject...");
      return new Color();
   }

   // 返回組件類型
   public Class<?> getObjectType() {
      // TODO Auto-generated method stub
      return Color.class;
   }

   //是單例?
   //true:這個bean是單實例,在容器中保存一份
   //false:多實例,每次獲取都會建立一個新的bean;
   public boolean isSingleton() {
      // TODO Auto-generated method stub
      return true;
   }

}

注意:1)、默認獲取到的是工廠bean調用getObject建立的對象
          2)、要獲取工廠Bean自己,咱們須要給id前面加一個&,  好比: &colorFactoryBean

//工廠Bean獲取的是調用getObject建立的對象
Object bean2 = applicationContext.getBean("colorFactoryBean");
Object bean3 = applicationContext.getBean("colorFactoryBean");
System.out.println("bean的類型:"+bean2.getClass());
System.out.println(bean2 == bean3);

Object bean4 = applicationContext.getBean("&colorFactoryBean");
System.out.println(bean4.getClass());
相關文章
相關標籤/搜索