admin管理员组文章数量:1599441
目录
@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 空配置 | × | matchIfMissing为false 意思是没有配置就不加载 |
(prefix = "comm.aa", name = "able", havingValue="123", matchIfMissing = true) | application.properties 空配置 | √ | matchIfMissing为true了,空配置,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 ...
版权声明:本文标题:Spring.通用条件类Condition 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728321580a1153892.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论