`

Springboot学习之@Conditional注解

    博客分类:
  • Java
阅读更多

Spring4提供了一个通用的基于特定条件创建Bean的方式:@Conditional注解。条件注解是根据特定的条件来选择Bean对象的创建。如果你想一个或多个Bean只有在应用的路径下包含特定的库时才创建,那么使用这个注解定义条件化的Bean就再适合不过了。

使用示例:
1、在Springboot工程的application.yml文件中添加配置内容:
magicCondition: true
 2、创建MagicCondition类,实现org.springframework.context.annotation.Condition接口,重新实现父类的matches方法:
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 MagicCondition implements Condition {

    /**
     * 实现matches方法,如果返回true就创建该Bean,如果返回false则不创建该Bean。
     * @param context
     * @param metadata
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        if(env.containsProperty("magicCondition")){ // 检查application.xml配置文件中是否存在magicCondition属性key
            String magicCondition = env.getProperty("magicCondition");// 获取属性的值
            return "true".equals(magicCodition); // 返回属性的值是否为true
        }
        return false; // 返回false
    }
}
 3、写demo用的service
public interface MagicService {

    String getInfo();
}
 
import com.wltjack.service.MagicService;

public class MagicServiceImpl implements MagicService {
    @Override
    public String getInfo() {
        return "MagicServiceImpl >>> getInfo() run...";
    }
}
 4、创建MagicConditionConfig配置类
import com.wltjack.common.MagicCondition;
import com.wltjack.service.impl.MagicServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * MagicConditionConfig配置类,当Spring容器中存在MagicCondition Bean对象,并满足MagicCondition类的条件时,才去实例化magicService这个Bean。
 */
@Configuration
@ComponentScan(basePackages = {"com.wltjack"})
public class MagicConditionConfig {

    @Bean
    @Conditional(MagicCondition.class) // 指定条件类
    public MagicServiceImpl magicService(){
        return new MagicServiceImpl();
    }

}
 @Conditional(MagicCondition.class) :指定条件类MagicCondition,当其matches方法返回true时才执行magicService方法实例化Bean。
5、创建MagicConditionController类,提供url访问入口:
import com.wltjack.common.SpringContextUtils;
import com.wltjack.service.MagicService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/magic/condition")
public class MagicConditionController {

    @GetMapping("/info")
    public String info(){
        try {
            MagicService ms = (MagicService) SpringContextUtils.getApplicationContext().getBean("magicService"); // 从Spring容器中获取magicService bean
            return ms.getInfo();
        }catch (Exception e){
            e.printStackTrace();
        }
        return "null";
    }
}
 其中,SpringContextUtils类提供了应用上下文的注入与获取,代码如下:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringContextUtils.applicationContext == null){
            SpringContextUtils.applicationContext  = applicationContext;
        }
        System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringContextUtils.getApplicationContext()获取applicationContext对象,applicationContext="+SpringContextUtils.applicationContext+"========");
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}
代码写完后,开始测试:
首先,将application.yml配置文件中的magicCondition值为true,启动应用,访问url:
可以看页面输出信息:

 然后,将application.yml配置文件中的magicCondition值为false,重启应用,访问url:
可以看页面输出信息:

 页面上已经不能输出serviceImpl方法中返回的文本,看到控制台已经出现如下错误信息:

 

 从错误提示中,我们可以看到magicService并没有实例化到Spring容器中。
最后,我们打开org.springframework.context.annotation.Condition类的类层次结构图,可以看到实现该接口的类:
 其中,SpringBootCondition类为Spring Boot中使用的所有条件实现的基础。
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 


 
 
 
 
 
 
 
 
 
 


 

 

 


 
 
 
 
 

 
 
 
 
 
 
 
  • 大小: 10.5 KB
  • 大小: 7.9 KB
  • 大小: 38.3 KB
  • 大小: 16.3 KB
分享到:
评论

相关推荐

    SpringBoot中使用@Conditional示例代码

    在Spring Boot框架中,`@Conditional`注解是条件装配的核心工具,它允许我们基于某些条件来决定是否加载或注册一个Bean。这个功能使得我们能够更精细化地控制应用的配置,仅在满足特定条件时才会激活某个Bean。下面...

    浅谈SpringBoot中的@Conditional注解的使用

    SpringBoot 中的 @Conditional 注解使用详解 @Conditional 注解是 Spring 4.0 之后出的一个非常有用的注解,主要用于根据具体的条件决定是否创建 Bean 到 Spring 容器中。下面我们来详细介绍 @Conditional 注解的...

    Spring Boot @Conditional注解用法示例介绍

    在Spring Boot框架中,`@Conditional`注解是条件化注解的核心,它允许你在创建Bean时设置特定的条件。当这些条件满足时,Bean才会被Spring容器注册并实例化。这一特性使得开发者可以根据应用程序的具体环境和配置...

    spring4.0 Conditional在满足特定条件下,才会实例化对象.docx

    Spring 4.0 引入了@Conditional注解,它提供了一种更加灵活的方式来决定何时实例化一个对象,根据特定的条件。这个功能使得我们能够更精细化地控制Spring容器中的bean装配,仅在满足特定条件时才创建和注册bean。 ...

    SpringBoot源码例子学习

    3. **自动配置**:SpringBoot通过`@Conditional`注解和对应的条件类实现自动配置。例如,如果你引入了`spring-boot-starter-data-jpa`,SpringBoot会自动配置JPA和数据源。 4. **控制器**:使用`@RestController`...

    springboot学习思维笔记.xmind

    条件注解@Conditional 组合注解与元注解 @Enable*注解的工作原理 直接导入配置类 依据条件选择配置类 动态注册Bean 测试 Spring TestContext Framework集成测试 SpringMVC基础 Spring MVC...

    SpringBoot源码分析Demo

    此外,SpringBoot还使用`@Conditional`系列注解来控制Bean的创建条件,如`@ConditionalOnClass`和`@ConditionalOnProperty`等,这些注解使得配置更加灵活和精确。 在`july-springboot`这个目录中,我们可以找到具体...

    动力节点springboot材料.rar_SpringBoot.xmind_springboot_动力节点

    3. **自动配置(Auto Configuration)**:SpringBoot 通过扫描类路径和 @Conditional 注解,自动配置相关 Bean。例如,当发现 MySQL 驱动在类路径上时,它会自动配置数据库连接。 4. **Actuator**:SpringBoot ...

    SpringBoot自动装配原理(简单易懂)

    SpringBoot使用`@Conditional`注解实现条件化配置,例如`@ConditionalOnClass`和`@ConditionalOnProperty`。如果满足条件,对应的配置就会生效。例如,如果项目中有`Jackson`库,那么`JacksonAutoConfiguration`就...

    spring-example-conditional:带有 Spring Boot 的自定义 Spring 4 @Conditional 注释示例

    自定义@Conditional 注释示例什么是@Conditional 是添加到 Spring 4 的注解,用于指定处理特定配置或将特定 bean 注册到 Spring 上下文的条件。为什么重要Spring Boot 项目自动配置支持依赖于 @Conditional - 它有...

    springboot01

    这一节将深入讲解如何利用@EnableAutoConfiguration注解来启用自动配置,以及@Conditional注解的作用。 5. **依赖管理**: "006、SpringBoot3-细节分析-依赖管理机制.mp4" - 在Spring Boot中,依赖管理简化了Maven或...

    SpringBoot2的最佳实践 SpringBoot2基础入门+底层注解+自动配置+高级特性与原理解析

    课程内容以时下最新的技术点为主线,逐步的进行展开,分别细化的讲解了SpringBoot2基础课程,SpringBoot2底层注解,SpringBoot2自动化配置,SpringBoot2请求处理,SpringBoot2高级特性和原理分析,是不可错过的...

    Springboot实现根据条件切换注入不同实现类的示例代码

    SpringBoot 框架提供了强大的依赖注入机制,通过使用 @Conditional 注解可以根据条件切换注入不同实现类。下面将详细介绍 SpringBoot 实现根据条件切换注入不同实现类的示例代码。 使用 @Conditional 注解 @...

    第三节-springboot源码解析-王炸篇.pdf

    Spring Boot还提供了一个注解@SpringBootApplication,它实际上是一个复合注解,包含@ComponentScan(包扫描)和@EnableAutoConfiguration(开启自动装配)。 自动装配的原理还与Spring的条件化装配有关,即@...

    springboot学习源码

    当我们谈到SpringBoot的源码时,不得不提到条件注解(Conditional Annotation)和自动配置(Auto Configuration)。例如,`@ConditionalOnClass`和`@ConditionalOnProperty`注解让SpringBoot可以根据类路径是否存在...

    springboot源码思维导图

    4. `Condition`和`@Conditional`:SpringBoot的条件注解机制,允许Bean的创建基于某些条件,例如类路径中是否存在某个文件或类。 四、源码学习的重要性 理解SpringBoot源码有助于开发者深入掌握其内部工作机制,...

    springboot入门成功案例

    3. 自动配置:基于条件注解(@Conditional)来决定哪些组件应该在特定条件下被启用。例如,如果检测到JDBC驱动,就会自动配置DataSource。 四、快速入门 1. 创建项目:使用Spring Initializr在线生成一个基础的...

    Spring Boot conditional注解用法详解

    Spring Boot conditional 注解用法详解 Spring Boot conditional 注解是 Spring Boot 框架中的一种重要机制,它允许开发者根据特定的条件来决定是否创建某个 Bean,这种机制可以极大地提高应用程序的灵活性和可维护...

Global site tag (gtag.js) - Google Analytics