1. 程式人生 > >Spring註解驅動開發——匯入元件

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