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") 可以返回工厂
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值