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);
	}
}

 

 

 

 

 

 

 

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