@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") 可以返回工厂