`

154. Spring Boot @Conditional、@ConditionalOnClass【从零开始学Spring Boot】

阅读更多

 

 

Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。

本章大纲:

(1)例子说明
(2)编码思路
(3)编写条件类WindowCondition和LinuxCondition
(4)编写接口CmdService以及两个实现类
(5)编写配置类,根据条件进行注入不同的类
(6)编写测试代码
(7)Spring提供的Condition
(8)题外话:怎么在Condition中获取application.properties的配置项

 

 

       接下里看下具体的内容:

1)例子说明

       java中这种情况,调用系统的cmd命令,但是我们知道在windowlinux下命令有些有些时候是不一样的,那么我们以前一般是这么处理;

 

//伪代码:
if(window){
       //具体的处理代码
}else if(Linux){
       //具体的处理代码.
}
 

 

       当具体的处理代码很多的时候,我们会放到另外一个处理类来进行处理,比如:WindowServiceLinuxService。你有没有发现这里如果我们使用了@Service进行注解WindowServieLinuxService的话,那么内存中就会存在两个Service,而实际上有一个service根本一次都不会执行到。好了,针对于这个问题@Conditional就可以解决。当然它还有其它强大的地方。

 

2)编码思路

       a)首先这里的话,有一个条件表达式的编写,满足什么条件下返回true,这个是接口Condition,我们需要去实现它;

       b)当满足条件的时候,进行做什么事情,这里使用的是@Conditional,当@Conditional(条件类.class)中的条件类返回true的时候,@Conditional所注解的类或者方法就会执行。

 

3)编写条件类WindowConditionLinuxCondition

WindowCondition

 

package com.kfit.demo.condition;
 
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
/**
 * window操作系统的条件:当在Window系统下运行的时候,matches方法会返回true,否则返回false.
 * @author Angel --守护天使
 * @version v.0.1
 * @date 2017年8月23日
 */
public class WindowCondition implements Condition{
 
    /**
     * 这里写自己的逻辑,只有返回true,才会启用配置
     */ 
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
       return context.getEnvironment().getProperty("os.name").contains("Windows");
    }
}
 

 

window操作系统的条件: 当在Window系统下运行的时候,matches方法会返回true,否则返回false.

LinuxCondition:

 

package com.kfit.demo.condition;
 
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
 
/**
 * Linux操作系统的条件:当在Linux系统下运行的时候,matches方法会返回true,否则返回false.
 * @author Angel --守护天使
 * @version v.0.1
 * @date 2017年8月23日
 */
public class LinuxCondition implements Condition{
 
    /**
     * 这里写自己的逻辑,只有返回true,才会启用配置
     */ 
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
       return context.getEnvironment().getProperty("os.name").contains("Linux");
    }
   
}
 

 

Linux操作系统的条件: 当在Linux系统下运行的时候,matches方法会返回true,否则返回false.

 

4)编写接口CmdService以及两个实现类

CmdService

package com.kfit.demo;
 
public interface CmdService {
    public void print();
}

 

       接口类,具体实现代码有两个serviceWindowCmdServiceLinuxCmdService

WindowCmdService

package com.kfit.demo.service;
 
import com.kfit.demo.CmdService;
 
public class WindowCmdService implements CmdService{
 
    @Override
    public void print() {
       System.out.println("Window cmd...");
    }
   
}

 

LinuxCmdService:

package com.kfit.demo.service;
 
import com.kfit.demo.CmdService;
 
public class LinuxCmdService implements CmdService{
 
    @Override
    public void print() {
       System.out.println("Linux cmd...");
    }
   
}

 

       注意:以上的两个实现类WindowCmdServiceLinuxCmdService这里我们并没有使用@Service注解进行注入,下面我们使用配置类根据不同的系统注入不同的类。

 

5)编写配置类,根据条件进行注入不同的类

CmdServiceConditionConfig

package com.kfit.demo.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
 
import com.kfit.demo.CmdService;
import com.kfit.demo.condition.LinuxCondition;
import com.kfit.demo.condition.WindowCondition;
import com.kfit.demo.service.LinuxCmdService;
import com.kfit.demo.service.WindowCmdService;
 
/**
 * 条件配置类.
 * @author Angel --守护天使
 * @version v.0.1
 * @date 2017年8月23日
 */
@Configuration
public class CmdServiceConditionConfig {
   
    /**
     * 当WindowCondition方法中的matches返回true的时候,
     * WindowCmdService会被注入,否则不注入。
     */
    @Bean("cmdService")
    @Conditional(WindowCondition.class)
    public CmdService windowCmdService(){
       return new WindowCmdService();
    }
   
   
    /**
     * 当LinuxCondition方法中的matches返回true的时候,
     * LinuxCmdService会被注入,否则不注入。
     */
    @Bean("cmdService")
    @Conditional(LinuxCondition.class)
    public CmdService LinuxCmdService(){
       return new LinuxCmdService();
    }
}

 

       这里使用@Conditional根据满足不同的条件注入不同的类,在Linux下会注入实现类LinuxCmdService,Window下会注入WindowCmdService

 

6)编写测试代码

在启动类的main方法中编写测试代码:

public static void main(String[] args) {
       ApplicationContext ctx =  (ApplicationContext) SpringApplication.run(App.class, args);
       CmdService cmdService = ctx.getBean(CmdService.class);
       cmdService.print();
    }

 

       Window下运行控制台打印信息:

Window cmd...

 

       Linux下运行控制台打印信息(亲测):

Linux cmd...

 

 

7Spring提供的Condition

除了自己自定义Condition之外,Spring还提供了很多Condition给我们用

 

a@ConditionalOnBean

仅仅在当前上下文中存在某个对象时,才会实例化一个Bean

b@ConditionalOnClass

       某个class位于类路径上,才会实例化一个Bean

c@ConditionalOnExpression

       当表达式为true的时候,才会实例化一个Bean

比如:

@ConditionalOnExpression("true")

@ConditionalOnExpression("${my.controller.enabled:false}")

d@ConditionalOnMissingBean

       仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean

e@ConditionalOnMissingClass

某个class类路径上不存在的时候,才会实例化一个Bean

f@ConditionalOnNotWebApplication

       不是web应用

 

 

8)题外话:怎么在Condition中获取application.properties的配置项

       在实际开发中,我们的条件可能保存在application.properties中,那么怎么在Condition中获取呢,这个很简单,主要通过ConditionContext进行获取,具体代码如下:

String port = context.getEnvironment().getProperty("server.port");
System.out.println(port);

 

 à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

分享到:
评论

相关推荐

    SpringBoot中使用@Conditional示例代码

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

    spring里@Conditional注解使用示例代码

    `@Conditional`注解的另一个常见用法是配合Spring Boot的内置条件注解,如`@ConditionalOnClass`(检查类路径中是否存在某个类)、`@ConditionalOnMissingBean`(如果容器中不存在某个bean,则创建新bean)等。...

    Spring-Boot-Reference-Guide, Spring Boot Reference Guide中文翻译 -《Spring Boot参考指南》.zip

    《Spring Boot参考指南》是Spring Boot开发者的重要参考资料,它详细阐述了Spring Boot框架的核心特性、配置方式、自动配置原理以及如何构建微服务应用等关键知识点。Spring Boot是Java开发领域中一个极其流行的轻量...

    Spring Boot 常用注解.rar

    **Spring Boot 常用注解详解** Spring Boot以其简洁的配置、快速的启动和集成众多优秀框架的能力,成为Java开发领域中的热门选择。在Spring Boot应用中,注解起着至关重要的作用,它们简化了配置,使得代码更加简洁...

    Spring In Action-3.2@Conditional条件化Bean

    Spring In Action-3.2@Conditional条件化Bean,Spring In Action-3.2@Conditional条件化Bean,Spring In Action-3.2@Conditional条件化Bean

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

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

    Spring boot中@Conditional和spring boot的自动配置实例详解

    "Spring Boot 中 @Conditional 和 Spring Boot 的自动配置实例详解" Spring Boot 中的自动配置是指根据不同的情况来决定 Spring 配置应该用哪个,不应该用哪个。这种机制可以让开发者更方便地进行开发和配置。在 ...

    @Conditional注解应用.rar

    在Java Spring框架中,`@Conditional`注解是实现条件化bean注入的关键工具。这个注解允许我们在配置bean时设置一些条件,只有当这些条件满足时,对应的bean才会被Spring容器实例化并注入到应用程序中。这样的设计极...

    26. 改变自动扫描的包【从零开始学Spring Boot】

    改变自动扫描的包【从零开始学Spring Boot】”涉及到的是Spring Boot框架中的组件扫描机制。在Spring Boot中,自动配置是其核心特性之一,它能够根据项目依赖来自动配置相应的Bean。默认情况下,Spring Boot会扫描...

    spring-boot-2.7.0.zip源码

    6. **条件注解**:Spring Boot使用`@Conditional`系列注解,如`@ConditionalOnClass`、`@ConditionalOnMissingBean`等,使得配置的启用基于特定条件,增加了代码的灵活性。 7. **属性绑定**:`@Value`和`@...

    SpringBoot中必须掌握的27个注解.pdf

    在Spring Boot框架中,注解扮演着至关重要的角色,它们简化了配置,使得开发者能够更加高效地构建应用程序。本文将详细介绍Spring Boot中27个必须掌握的注解,分为Spring框架基础注解和Spring Boot核心注解两部分。 ...

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

    为什么重要Spring Boot 项目自动配置支持依赖于 @Conditional - 它有自己的构造型注释,如或来初始化 Spring 上下文,以便依赖于类路径(或适用于任何其他条件的其他自定义条件注释)。这个例子此示例展示了如何将...

    spring boot面试题及答案.docx

    ### Spring Boot 面试题解析 #### 1. 什么是Spring Boot? Spring Boot 是一款由 Pivotal 团队提供的全新框架,旨在简化新Spring应用的初始搭建以及开发过程。传统的Spring应用需要进行大量的XML配置,这不仅繁琐...

    Spring Boot核心技术-笔记-pdf版.pdf

    Spring Initializr是一个在线生成Spring Boot项目结构的工具,通过选择技术栈、版本等,可以快速生成一个基础的Spring Boot项目结构,便于开发者快速开始编码。 8. **Web开发** Spring Boot对Web开发提供了很好的...

    程序员面试宝典 Spring Boot常见面试题 原理介绍

    答:Spring Boot通过@Conditional注解,结合@ComponentScan扫描到的@ConfigurationProperties,根据条件加载特定的配置类。例如,如果检测到类路径下有hibernate.properties,就会启用Hibernate的相关配置。 2. ...

    springboot注解.docx

    Spring Boot 是一个快速开发框架,它简化了基于Spring的应用程序的初始设置和配置。在Spring Boot中,注解起着至关重要的作用,因为它们能够帮助我们实现自动化配置和声明式编程。以下是关于Spring Boot最核心的25个...

    Spring @Conditional注解讲解及示例详解

    Spring @Conditional注解讲解及示例详解 Spring @Conditional注解是Spring框架中的一种重要注解,它可以根据一定的条件进行判断,满足条件则将Bean注册到容器中。@Conditional注解可以标注在类和方法上,它的定义...

    Spring之条件注解@Conditional(Demo)

    在Spring框架中,`@Conditional`注解是一个强大的特性,它允许我们基于特定的条件来决定是否注册某个Bean。这个注解使得我们能够在运行时根据系统环境、配置或其他自定义逻辑来选择性地加载和初始化Bean。这为我们的...

    Spring Boot技术知识点:如何读取不同路径里的applicationContext.xml配置文件2

    在实际开发中,你还需要确保XML配置中的bean与Spring Boot的自动配置不冲突,必要时可以使用`@Profile`或`@Conditional`注解来控制不同环境下的配置加载。 总结来说,Spring Boot虽然主要依赖Java和YAML配置,但...

    Spring Boot详解

    - 基于条件注解(@Conditional)和@EnableAutoConfiguration,Spring Boot会根据项目中的类路径判断哪些自动配置应该生效。 6. Spring Boot的Web开发 - 使用@RestController和@RequestMapping等注解构建RESTful ...

Global site tag (gtag.js) - Google Analytics