@Conditional註解會根據某個條件註冊相應實列,如果不滿足則不註冊。
@Configuration
@ComponentScan(value = "cn.caraliu")
public class Configure {
@Conditional({MyCondition.class}) // 條件的判斷
@Bean
public Caraliu caraliu1(){
return new Caraliu("caraliu",18,"hello");
}
}
條件判斷類:
/**
* @author jeffchan 2020/03/22
*/
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
實現Condition類,重寫matches方法,當返回true,表示註冊,否則不註冊。
@Import 快速將一個bean註冊到IOC容器中,id默認爲改類的全類名:
@Import(CaraliuImport.class)
public class Configure {
}
上述的代碼可以相關的類型註冊到IOC容器中,發現會兩個類:
一個是configure另外一個cn.caraliu.apibean.CaraliuImport
使用 ImportSelector
實現該接口:
/**
* @author jeffchan 2020/03/22
*/
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//這裏可以進行相關邏輯的處理,我直接寫死返回了某個類的全類名
return new String[]{"cn.caraliu.apibean.CaraliuImportSelector"};
}
}
@Import({MyImportSelector.class})
public class Configure {
}
測試可以發現:容器中多了一個bean: cn.caraliu.apibean.CaraliuImportSelector
使用 ImportBeanDefinitionRegistrar
實現上述接口:
public class MyImportBeanRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//設置需要注入IOC容器的類,這裏可以自定義bean的id
beanDefinitionRegistry.registerBeanDefinition("caraliu", new RootBeanDefinition(Caraliu.class));
}
}
@Import({MyImportBeanRegister.class})
public class Configure {
}
測試發現容器中已經加入了caraliu
實現FactoryBean的接口:
package springboot.configure;
import org.springframework.beans.factory.FactoryBean;
import springboot.apibean.Caraliu;
/**
* @author jeffchan 2020/03/22
*/
public class MyFactoryBean implements FactoryBean<Caraliu> {
@Override
public Caraliu getObject() throws Exception {
//需要註冊的bean
return new Caraliu();
}
@Override
public Class<?> getObjectType() {
//注入的bean的類型
return Caraliu.class;
}
@Override
public boolean isSingleton() {
//是否是單實例的
return true;
}
}
然後將MyFactoryBean 註冊到IOC容器中:
@Configuration
public class Configure {
@Bean
public MyFactoryBean myFactoryBean(){
return new MyFactoryBean();
}
}
測試發現容器中多了一個myFactoryBean實列:
直接通過id獲取,發現是Caraliu的實列
如果想要獲取工廠,可以在獲取的id前面加&,即如下
applicationContext.getBean("&myFactoryBean") 可以返回工廠