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

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

概述


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

20181027222643169.png

例子


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


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

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注解

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;
    }
}


测试

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);
    }
}


结果


20181027223818461.png


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

将 datasource.driverName 改为 datasource.driverName1


20181027223948459.png

重新测试,抛出了异常。

20181027224026308.png


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


其他相关的注解


201810272247328.png

相关文章
|
6天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
68 26
|
2月前
|
XML 安全 Java
|
13天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
32 6
|
26天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
250 12
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
74 8
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
70 6
|
2月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
137 3