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