Spring注解驱动开发——导入组件

1、@Import快速导入一个组件

容器中注册组件的方式:

    ①包扫描+组件注解(@Controller、@Service、@Repository、@Component)

    ②@Bean

    ③@Import:值是一个Class[],容器会注册被导入的类,可用来导入第三方的类对象,或者一个包下仅有极少数的类需要被纳入IOC容器管理时,导入对象的id默认为组件的全类名

@Configuration
@Import({Student.class,Teacher.class})
public class MainConfig {

	@Bean
	@Conditional({MyCondition.class})
	public Person person(){
		return new Person("张三",12);
	}
	
	@Bean
	public Person person1(){
		return new Person("李四",13);
	}
}

ImportSelector:是一个接口,子类需实现其selectImports方法,该方法的入参是AnnotationMetadata(可获取当前标注@Import注解的类的所有注解信息),返回需要导入的组件的全类名数组,不能返回null,否则会报空指针异常

public class MyImportSelector implements ImportSelector{

	public String[] selectImports(AnnotationMetadata metadata) {
		return new String[]{"com.bdm.modle.Teacher"};
	}

}

使用ImportSelector:可实现有条件的导入

@Configuration
@Import({Student.class,MyImportSelector.class})
public class MainConfig {

	@Bean
	@Conditional({MyCondition.class})
	public Person person(){
		return new Person("张三",12);
	}
}

此时容器中导入的类除了Student之外,还包括MyImportSelector的selectImports方法中返回的数组

ImportBeanDefinitionRegistrar:也是一个接口,子类需实现其registerBeanDefinitions方法,该方法的入参是AnnotationMetadata(获取类的注解信息)和BeanDefinitionRegistry(调用其registerBeanDefinition方法注册Bean),通过实现此接口可以使容器手工注册组件

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{

	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		boolean flag = registry.containsBeanDefinition("person");//如果容器中含有person
		if(flag) {
			RootBeanDefinition beanDefinition = new RootBeanDefinition(Teacher.class);
			//指定bean的id
			registry.registerBeanDefinition("teacher", beanDefinition);
		}
	}
}
@Configuration
@Import({Student.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {

	@Bean
	@Conditional({MyCondition.class})
	public Person person(){
		return new Person("张三",12);
	}
}

你可能感兴趣的:(Spring注解驱动开发)