SpringBoot之@Conditional注解实现选择性的创建Bean操作

Condition 是在Spring 4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。即满足这个条件才帮我们创建Bean。

从一个案例出发学习Condition

需求:在Spring的IOC容器中有一个User的Bean,现要求:导入Jedis坐标后,加载该Bean,没导入,则不加载。

没加condition的情况

1、先创建一个名为User的Bean

java 复制代码
@Component
public class User {
}

2、创建配置类

java 复制代码
@Configurable
public class UserConfig {

   @Bean
    public User user(){
        return new User();
    }
}

3、获取user,打印出来

java 复制代码
public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
    Object user = context.getBean("user");
    System.out.println(user);

}

此时运行结果:可以得到user

@Conditional注解

我们在代码中加入一个@Conditional注解,查看这个注解。

java 复制代码
@Configurable
public class UserConfig {
   @Bean
   @Conditional()
    public User user(){
        return new User();
    }
}

查看 @Conditional

java 复制代码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    Class<? extends Condition>[] value();
}

查看Condition接口

java 复制代码
@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

使用时,加入@Conditional注解,里面传一个public interface Condition接口的实现类,并且复写matches方法,返回true或者false。如果返回true。那么这个bean将被spring容器创建。

参数context:上下文对象,用于获取环境、IOC容器、ClassLoader对象

参数metadata注解元对象,用于获取注解定义的属性值

使用注解:实现导入Jedis坐标后,加载该Bean,没导入,则不加载。

1、导入jedis依赖

java 复制代码
 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

2、创建ClassCondition类实现Condition接口,重写matches方法。

java 复制代码
public class ClassCondition implements Condition {
    @Override
    //判断import redis.clients.jedis.Jedis文件是否存在,
   //存在,就表示导入了jedis

    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        boolean flag=true;
        try {
            Class<?> aClass = Class.forName("redis.clients.jedis.Jedis");
        } catch (ClassNotFoundException e) {
            flag=false;
        }
        return flag;
    }
}

3、加入@Conditional注解

java 复制代码
@Configurable
public class UserConfig {
   @Bean
   @Conditional(ClassCondition.class)
    public User user(){
        return new User();
    }
}

运行结果:

注释掉jedis依赖,结果

相关推荐
Absurd587几秒前
CSS如何使用-default获取默认选项样式_通过状态伪类突出预选表单项
jvm·数据库·python
曹牧4 分钟前
Spring :component-scan
java·后端·spring
风吹迎面入袖凉6 分钟前
【Redis】Redis缓存击穿
数据库·redis·缓存
weixin_458580128 分钟前
CSS如何让flex布局支持老版本浏览器_添加-webkit-前缀与兼容性写法
jvm·数据库·python
Shorasul13 分钟前
CSS viewport单位在旧移动端支持不佳_利用固定像素值与rem配合
jvm·数据库·python
下地种菜小叶14 分钟前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
z44247532615 分钟前
CSS如何实现响应式布局_使用Flexbox与Grid提升适配效率
jvm·数据库·python
做个文艺程序员17 分钟前
Spring Boot 项目集成 OpenClAW【OpenClAW + Spring Boot 系列 第1篇】
java·人工智能·spring boot·开源
Absurd58723 分钟前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实用指南
jvm·数据库·python
2301_8152795223 分钟前
怎样通过Navicat高效导出ER模型为PDF文档_大幅提升绘制效率
jvm·数据库·python