admin管理员组

文章数量:1599902

目录

@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 ...

 

本文标签: 条件Springcondition