springboot-注解使用(3)-@Conditional @Import FactoryBean

@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") 可以返回工厂
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章