Spring註解驅動開發——匯入元件
阿新 • • 發佈:2018-12-21
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);
}
}