首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring Boot2.x-06Spring Boot基础-使用@Conditional注解根据特定的条件装配bean

Spring Boot2.x-06Spring Boot基础-使用@Conditional注解根据特定的条件装配bean

作者头像
小小工匠
发布2021-08-17 15:33:34
发布2021-08-17 15:33:34
5780
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录

概述

假设在某些特定的场景下,希望根据特定的条件去加载某个或某些bean,我们可以使用@Condtional注解, Spring 4.0的时候加入的这个注解。


例子

假设,我们在配置了数据库的几个属性时,才去实例化bean,否则不初始化这个bean。这个例子可能不太合适,权当理解这个注解的用法了


Step1 实现Condition接口,重写matches方法

代码语言:javascript
复制
package com.artisan.springbootmaster.conditional;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 *
 */
public class DatabaseCondtional implements Condition {

    /**
     * 数据库bean的装配条件
     *
     * @param context  上下文
     * @param metadata 注释类型的元数据
     * @return  true 装配Bean ,否则不装配
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 根据context取出对应的Env信息
        Environment environment = context.getEnvironment();
        // 判断属性文件是否存在对应的数据库配置
        return environment.containsProperty("datasource.driverName")
                && environment.containsProperty("datasource.url")
                && environment.containsProperty("datasource.username")
                && environment.containsProperty("datasource.password");
    }
}

Step2 在对应的@Bean上使用@Conditional注解

代码语言:javascript
复制
package com.artisan.springbootmaster.conditional;

import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@PropertySource(value = "classpath:jdbc.properties",ignoreResourceNotFound = true)
public class Config {


    @Bean(name = "datasource" ,destroyMethod = "close")
    @Conditional(DatabaseCondtional.class)
    public DataSource initDataSource(
            @Value("${datasource.driverName}") String driver,
            @Value("${datasource.url}") String url,
            @Value("${datasource.username}") String username,
            @Value("${datasource.password}") String password){


        System.out.println("driver:" + driver + "\n url:" + url+ "\n username:" + username
        + "\n password:" + password) ;

        Properties properties = new Properties();
        properties.setProperty("driver",driver);
        properties.setProperty("url",url);
        properties.setProperty("username",username);
        properties.setProperty("password",password);

        DataSource dataSource = null;
        try {
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataSource;
    }
}

测试

代码语言:javascript
复制
package com.artisan.springbootmaster.conditional;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.sql.DataSource;

public class Test {

    public static void main(String[] args){

        ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

       //DataSource dataSource = (DataSource) ctx.getBean("datasource");
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println("datasource:" + dataSource);

    }
}

结果

当我们修改掉某个属性后,DatabaseCondtional#matches方法肯定返回false, 按照推测,该bean不会被加载到IoC容器中,我们来验证下

将 datasource.driverName 改为 datasource.driverName1

重新测试,抛出了异常。

因为我们在获取bean的时候,IoC容器中并不存在该bean。


其他相关的注解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/10/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 概述
  • 例子
    • Step1 实现Condition接口,重写matches方法
    • Step2 在对应的@Bean上使用@Conditional注解
    • 测试
  • 其他相关的注解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档