Spring.通用条件类Condition

目录

@ConditionalOnClass

属性

疑问

场景

DEMO

@ConditionalOnMissingClass

@ConditionalOnBean

属性

@ConditionalOnMissingBean

@ConditionalOnProperty

属性

场景

复合条件

加载顺序控制

@Order

@AutoConfigureAfter@DependsOn@Priority


org.springframework.context.annotation.Condition

查看实现,很多,如下截取部分。

下面列举一下常用的条件类。

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

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

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

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

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

@ConditionalOnNotWebApplication(不是web应用)

@ConditionalOnClass

only matches when the specified classes are on the classpath

匹配条件:指定的Class已经存在于classpath中,即:有这个类。

属性

name  class类的全路径

value  Class类Test1.class   --推荐

疑问

既然Test1不存在与当前classpath中,那么@ConditionalOnClass(Test1.class)不会报错吗?

解惑:A工程,引入Bjar包,Test1是B.jar中的类。就会报错。 也就是说@ConditionalOnClass不是为这种场景准备的

场景

A依赖B;B依赖C;B规定C的依赖传递是provided,那么A就看不到C,这时:B类就可以添加@ConditionalOnClass(C.class)
条件:如果A依赖或者不依赖C 
举例:
1. SpringBoot 依赖 spring-boot-autoconfigure.jar
2. spring-boot-autoconfigure.jar 中有:
@ConditionalOnClass(Flyway.class)
public class FlywayAutoConfiguration
3. Flyway 是flyway-core.jar包中的类,也就是说:spring-boot-autoconfigure.jar一定会依赖flyway-core.jar包的
4. springboot 并没有引入flyway-core.jar包,也看不到,也没报错
5.springboot 要想FlywayAutoConfiguration生效,只需要引入flyway-core.jar包即可

DEMO

AA:

@SpringBootTest(classes = Spring4ConditionApplication.class)
@RunWith(SpringRunner.class)
public class TestOnClassCondirional {
	
	@Autowired(required = false)
	private Testbb1 Testbb1;
	
	@Test
	public void test1(){
		Assert.assertNotNull("Testbb1 is null ...",Testbb1);
	}

}

条件:引入或者不引入
  <dependency>
      <groupId>com.example</groupId>
      <artifactId>testcc</artifactId>
      <version>0.0.1-SNAPSHOT</version>
  </dependency>

引入:则Testbb1不为null
不引入:Testbb1为null

BB:scope控制maven的依赖传递。

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;

import com.testcc.Testcc1;

@Component
@ConditionalOnClass(Testcc1.class)
public class Testbb1 {
}

<dependency>
	<groupId>com.example</groupId>
	<artifactId>testcc</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<scope>provided</scope>
</dependency>

CC:

public class Testcc1 {

}

备注:mvn 相关依赖传递和调整 见附录。

@ConditionalOnMissingClass

顾名思义,路径没有该类时,是@ConditionalOnClass的match not 的场景。

@ConditionalOnBean

容器中包括该类的对象时。

属性

value 类型Class类Test1.class

name  Bean的名称

@ConditionalOnMissingBean

@ConditionalOnBean 的非

@ConditionalOnProperty

控制配置类是否生效,可以将配置与代码进行分离,实现了更好的控制配置。

属性

prefix  配置前缀,示例:comm.aa,可以缺省
name  配置项名称,示例:able,可以是:comm.aa.able
havingValue  配置项的值,示例:123,缺省为true

当配置项comm.aa.able=123时,

功能:

matchIfMissing 当没有配置项时,是否匹配,取值:true/false,缺省默认false
	true:当没有配置项时,创建Bean
	false: 当没有配置项时,不创建Bean

value 可以替代name,不能同时使用

场景

@Component

@ConditionalOnProperty(prefix = "comm.aa", name = "able", matchIfMissing = false)

public class Test3 {

}

application.properties

comm.aa.able= 1234

Tester

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.example.spring4condition.onproperties.Test3;

@SpringBootTest(classes = Spring4ConditionApplication.class)
@RunWith(SpringRunner.class)
public class TestOnPropertiesCondirional {
	
	@Autowired(required = false)
	private Test3 test3;
	
	@Test
	public void test3(){
		Assert.assertNotNull("test3 is null ...",test3);
	}
}

场景测试:

ConditionalOnProperty

配置

加载

备注

(prefix = "comm.aa",

name = "able",

havingValue="123",

matchIfMissing = false)

application.properties  comm.aa.able= 123

期望配置为123,就加载

(name = " comm.aa.able",

havingValue="123",

matchIfMissing = false)

application.properties  comm.aa.able= 123

prefix可以没有

(value= " comm.aa.able",

havingValue="123",

matchIfMissing = false)

application.properties  comm.aa.able= 123

value可以替代name,二者不可同时使用

(prefix = "comm.aa",

name = "able",

havingValue="123",

matchIfMissing = false)

application.yml

comm:

    aa:

        able: 123

Yml配置,期望值123

(prefix = "comm.aa",

name = "able",

havingValue="123",

matchIfMissing = false)

application.properties  comm.aa.able= 1234

×

期望值为123

实际为1234

不匹配,所以不加载

(prefix = "comm.aa",

name = "able",

havingValue="123",

matchIfMissing = false)

application.properties 空配置

×

matchIfMissingfalse 意思是没有配置就不加载

(prefix = "comm.aa",

name = "able",

havingValue="123",

matchIfMissing = true)

application.properties 空配置

matchIfMissingtrue了,空配置,bean加载了

(prefix = "comm.aa",

name = "able",

matchIfMissing = true)

application.properties  comm.aa.able= 1234

×

havingValue缺失默认为true,实际为123,不加载

(prefix = "comm.aa",

name = "able",

matchIfMissing = true)

application.properties  comm.aa.able= true

havingValue缺失默认为true,实际为true,加载

复合条件

多个条件 同时 使用到一个类上。

与关系

顺序是从上到下,遇到false就不在向下。

同一个@Conditional1不可重复放在一个类上。

 

加载顺序控制

@Order

org.springframework.core.annotation.Order

@AutoConfigureAfter
@DependsOn
@Priority


end ...

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java8新特性及实战视频教程完整版Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda 表达式可以使代码变的更加简洁紧凑。Java8实战视频-01让方法参数具备行为能力Java8实战视频-02Lambda表达式初探Java8实战视频-03Lambda语法精讲Java8实战视频-04Lambda使用深入解析Java8实战视频-05Lambda方法推导详细解析-上.wmvJava8实战视频-06Lambda方法推导详细解析-下Java8实战视频-07Stream入门及Stream在JVM中的线程表现Java8实战视频-08Stream知识点总结Stream源码阅读Java8实战视频-09如何创建Stream上集Java8实战视频-10如何创建Stream下集.wmvJava8实战视频-11Stream之filter,distinct,skip,limit,map,flatmap详细介绍Java8实战视频-12Stream之Find,Match,Reduce详细介绍Java8实战视频-13NumericStream的详细介绍以及和Stream之间的相互转换Java8实战视频-14Stream综合练习,熟练掌握API的用法Java8实战视频-15在Optional出现之前经常遇到的空指针异常.wmvJava8实战视频-16Optional的介绍以及API的详解Java8实战视频-17Optional之flatMap,综合练习,Optional源码剖析Java8实战视频-18初识Collector体会Collector的强大Java8实战视频-19Collector使用方法深入详细介绍-01Java8实战视频-20Collector使用方法深入详细介绍-02Java8实战视频-21Collector使用方法深入详细介绍-03.wmvJava8实战视频-22Collector使用方法深入详细介绍-04Java8实战视频-23Collector原理讲解,JDK自带Collector源码深度剖析Java8实战视频-24自定义Collector,结合Stream的使用详细介绍Java8实战视频-25Parallel Stream编程体验,充分利用多核机器加快计算速度Java8实战视频-26Fork Join框架实例深入讲解Java8实战视频-27Spliterator接口源码剖析以及自定义Spliterator实现一个Stream.wmvJava8实战视频-28Default方法的介绍和简单的例子Java8实战视频-29Default方法解决多重继承冲突的三大原则详细介绍Java8实战视频-30多线程Future设计模式原理详细介绍,并且实现一个Future程序Java8实战视频-31JDK自带Future,Callable,ExecutorService介绍Java8实战视频-32实现一个异步基于事件回调的Future程序.wmvJava8实战视频-33CompletableFuture用法入门介绍Java8实战视频-34CompletableFuture之supplyAsync详细介绍Java8实战视频-35CompletableFuture流水线工作,join多个异步任务详细讲解Java8实战视频-36CompletableFuture常用API的重点详解-上Java8实战视频-37CompletableFuture常用API的重点详解-下Java8实战视频-38JDK老DateAPI存在的问题,新的DateAPI之LocalDate用法及其介绍.wmvJava8实战视频-39New Date API之LocalTime,LocalDateTime,Instant,Duration,Period详细介绍Java8实战视频-40New Date API之format和parse介绍

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值