spring註解---@Import註解 快速註冊組件

@Import註解註解

          - {@link Configuration} :可以放入一個配置類

          -{@link ImportSelector} : ImportSelector

          -{@link ImportBeanDefinitionRegistrar} :ImportBeanDefinitionRegistrar

public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
	Class<?>[] value();

}

 

1 @Import(組件名):快速的向容器中註冊一個組件。 {@link Configuration}

      容器中組件的id:組件的全類名。com.rayli.beans.Cat  com.rayli.beans.Dog

@Configuration
@Import({Cat.class,Dog.class})
public class ConfigTest1 {	
	@Bean
	public Person person() {
		return new Person("gege", 789);
	}
}

2 @Import註解,使用ImportSelector,向IOC容器中註冊組件。 -{@link ImportSelector}

  ImportSelector是一個接口,使用它需要有一個它的實現了類。

public interface ImportSelector {
	String[] selectImports(AnnotationMetadata importingClassMetadata);
}

   2.1 創建實現類。實現ImportSelector 接口。返回包含要註冊組件的全類名數組。

public class MyImportSelector implements ImportSelector {

	/**
	 * AnnotationMetadata參數:可以拿到使用該類的那個標註類的所有的註解信息。
	 * 
	 * 不能返回null值,因爲後面會用到返回值的length屬性。
	 * 
	 * 返回是一個String[]類型的數組,把想要註冊的類的全類名都放到數組中即可。
	 * 
	 */
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[]{"com.rayli.beans.Ege","com.rayli.beans.Pig"};
	}

}

  2.2 使用ImportSelector,在@Import註解中使用即可。導入到IOC容器中的組件的id也是全類名

@Configuration
@Import({Cat.class,Dog.class,MyImportSelector.class})
public class ConfigTest1 {	
	@Bean
	public Person person() {
		return new Person("gege", 789);
	}
}

  PS:其實ImportSelector和第一種寫入類沒有本質上的區別,如果需要註冊的組件比較多,可以寫一個類,把

           要註冊的組件都放入這個類,即ImportSelector,進行一下封裝。

3 ImportBeanDefinitionRegistrar:手動註冊bean(可以指定bean在IOC容器的id)

  3.1 繼承ImportBeanDefinitionRegistrar接口,向IOC容器中註冊類。

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	/**
	 * AnnotationMetadata:調用類的註解信息
	 * BeanDefinitionRegistry:註冊類信息
	 *    可以調用registerBeanDefinition()方法手工註冊bean
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //containsBeanDefinition()容器中是否包含該bean
		boolean cat = registry.containsBeanDefinition("cat");
		boolean dog = registry.containsBeanDefinition("pig");	
		if(cat && dog) {
			/**
			 * registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			 * beanName:要註冊的bean咋在IOC容器中的id,之前的方法在容器中的名字都是全類名。
			 * beanDefinition: 通過new RootBeanDefinition(Animal.class)來加載要註冊的bean
			 */
			RootBeanDefinition beanDefinition = new RootBeanDefinition(Animal.class);
			registry.registerBeanDefinition("animal", beanDefinition);
		}
	}
}

3.2 配置課類中使用。

@Configuration
@Import({Cat.class,Dog.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class ConfigTest1 {	
	@Bean
	public Person person() {
		return new Person("gege", 789);
	}
}

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章