SpringBoot中Condition包下常用条件依赖注解详细介绍及案例使用

SpringBoot中Condition包下常用条件依赖注解详细介绍及案例使用

SpringBoot中Condition下常用条件依赖注解详细介绍及案例使用

@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置@ConditionalOnMissingClass() Spring中不存在指定class对象时,注入指定配置@ConditionalOnBean() 根据ioc中判断有没有此实例对象,有则加载指定配置ConditionalOnMissingBean() 根据ioc中判断有没有此实例对象,没有则加载指定配置@ConditionalOnProperty() 配置文件中配置的指定参数值符合要求时,加载此配置@ConditionalOnExpression() 配置文件中配置的指定参数值与我给的值比较为true时,加载此配置@ConditionalOnResource() 指定的资源文件出现在classpath中生效(就是编译后target里classes里的路径名是否存在)链接:[condition包下常用注解案例源代码下载地址](https://download.csdn.net/download/JAVA_MHH/16311322)

@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置

和ConditionalOnBean()的区别在于ConditionalOnBean()是根据ioc里是否有此实例对象,而ConditionalOnClass()表示只要在Spring中有这个类就可以

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

com.alibaba

fastjson

1.2.71

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

3.定义@ConditionalOnClass()配置类

name = “com.alibaba.fastjson.JSON” 表示此spring中是否有这个类,有的话就注入此配置到ioc

import com.it.mhh.entry.Student;

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

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnClass {

@Bean

@ConditionalOnClass(name = "com.alibaba.fastjson.JSON")

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4.启动类测试

@ConditionalOnClass() Spring中存在指定class,对应该配置才会生效

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

//@ConditionalOnClass() Spring中存在指定class,对应该配置才会生效

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent); //Student{name='小白', age=12}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

@ConditionalOnMissingClass() Spring中不存在指定class对象时,注入指定配置

和ConditionalOnMissingBean()的区别在于ConditionalOnMissingBean()是根据ioc里没有此实例对象,而ConditionalOnClass()表示只要在Spring中没有这个类就可以

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

3.定义@ConditionalOnMissingClass()配置类

name = “com.alibaba.fastjson.JSON” 表示此spring中是否有这个类,有的话就不注入此配置到ioc

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnMissingClass {

@Bean

@ConditionalOnMissingClass("com.alibaba.fastjson.JSON")

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4.启动类测试

@ConditionalOnMissingClass Spring容器中不存在指定class,注入指定配置

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

//@ConditionalOnMissingClass Spring容器中不存在指定class,注入指定配置

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent); //Student{name='小白', age=12}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

@ConditionalOnBean() 根据ioc中判断有没有此实例对象,有则加载指定配置

和ConditionalOnClass()的区别在于ConditionalOnClass()是根据Spring中是否有此类,而ConditionalOnBean()表示在ioc中是否由此实例对象;

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

2.1 引入条件判断实体类

将此类注入ioc容器

importorg.springframework.stereotype.Component;

@Component

Public class BeanServer{

}

3.定义@ConditionalOnBean()配置类

BeanServer.class :判断ioc中是否有此类对象,有的话就加载此配置

import com.it.mhh.customConditionOnBeanOrOnMissingBean.server.TestServer;

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnBean {

@Bean

@ConditionalOnBean(BeanServer.class)

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4.启动类测试

@ConditionalOnBean() Spring容器中存在指定class实例对象时,注入指定配置

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

//@ConditionalOnBean() Spring容器中存在指定class实例对象时,注入指定配置

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent); //Student{name='小白', age=12}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

ConditionalOnMissingBean() 根据ioc中判断有没有此实例对象,没有则加载指定配置

和ConditionalOnMissingClass()的区别在于ConditionalOnMissingClass()是根据Spring中是否有此类,而ConditionalOMissingnBean()表示在ioc中是否由此实例对象;

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

2.1 引入条件判断实体类

不注入此类到ioc容器

importorg.springframework.stereotype.Component;

//@Component

Public class BeanServer{

}

3定义@ConditionalOnMissingBean()配置类

BeanServer.class :判断ioc中是否有此类对象,没有的话就加载此配置

import com.it.mhh.customConditionOnBeanOrOnMissingBean.server.TestServer;

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

//@Configuration

public class CustomConditionOnMissingBean {

@Bean

@ConditionalOnMissingBean(BeanServer.class)

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4.启动类测试

@ConditionalOnMissingBean() Spring ioc中不存在指定class实例对象时,注入指定配置

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

//@ConditionalOnMissingBean() Spring容器中不存在指定class实例对象时,注入指定配置

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent); //Student{name='小白', age=12}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

@ConditionalOnProperty() 配置文件中配置的指定参数值符合要求时,加载此配置

与@ConditionalOnExpression()的区别在于@ConditionalOnProperty() 注解使用的是通过注解中的属性赋值作为参照物和yml里的配置进行匹配是否为相同;

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

3定义@ConditionalOnProperty() 配置类

prefix = “class”,name = “teacher”,matchIfMissing=false, havingValue = “小黑” @ConditionalOnProperty()中属性含义 public @interface ConditionalOnProperty { String[] value() default {}; // 数组,获取对应yml名称的key,与name含义一样,不能同时使用value和name; String prefix() default ""; //配置文件中yml名称的前缀; String[] name() default {};// 数组,获取对应yml名称的key,与value含义一样,不能同时使用value和name; String havingValue() default ""; //配置文件yml的value值 boolean matchIfMissing() default false; //配置文件yml中没有与之匹配到的数值,是否加载,true:表示正常加载此配置,false表示如果yml中没有此数值就不加载; }

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnProperty {

@Bean

@ConditionalOnProperty(prefix = "class",name = "teacher",matchIfMissing=false, havingValue = "小黑")

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4 application.yml配置

@ConditionalOnProperty()注解中的 prefix 属性就是此yml配的前缀 yml,name就是 teacher,而havingValue 则就是’小黑’,如果application中有此配置,则加载相应配置

class:

teacher: 小黑

5.启动类测试

@ConditionalOnProperty()配置文件中配置的指定参数值符合要求时,加载此配置

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

// @ConditionalOnProperty()配置文件中配置的指定参数值符合要求时,加载此配置

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent); //Student{name='小白', age=12}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

@ConditionalOnExpression() 配置文件中配置的指定参数值与我给的值比较为true时,加载此配置

与@ConditionalOnProperty() 的区别在于@ConditionalOnExpression()注解使用的是SpringEL表达式与我给的值进行匹配,为true时加载配置,而@ConditionalOnProperty() 注解使用的是通过注解中的属性赋值作为参照物和yml里的配置进行匹配是否为相同;

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

3.定义@ConditionalOnExpression() 配置类

“’${class.teacher}’.equals(‘小黑’)” :Spring EL表达式 ,配置文件class.teacher里对应的值去比较我输入的’小黑‘是否相同,true:加载此配置;

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnExpression {

@Bean

//配置文件中配置的指定参数值与我要做比较的值为true时,加载此配置

@ConditionalOnExpression("'${class.teacher}'.equals('小黑')")

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4 application.yml配置

@ConditionalOnExpression()注解 value属性就是此配置的键 class.teacherg 而获取到的值就是’小黑‘,然后进行比较, true则加载相应配置

class:

teacher: 小黑

5.启动类测试

@ConditionalOnExpression()//配置文件中配置的指定参数值与我传的参数进行比较,如果相同则为true,加载此配置,否则不加载

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

// @ConditionalOnExpression()//配置文件中配置的指定参数值与我传的参数比较,相同为true时,加载此配置

@SpringBootApplication

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent);

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------

@ConditionalOnResource() 指定的资源文件出现在classpath中生效(就是编译后target里classes里的路径名是否存在)

指定文件路径名存在时,对应配置生效

1.首先引入pom依赖

org.springframework.boot

spring-boot-starter-parent

2.3.2.RELEASE

org.springframework.boot

spring-boot-starter-web

2.实体类测试对象

根据Condition返回结果表示是否将此对象注入ioc中; true:表示注入ioc

//根据Condition返回结果表示是否注入ioc中true:表示注入ioc

public class Student {

String name="小白";

Integer age =12;

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

定义@ConditionalOnResource()配置类

resources = “com\it\mhh” :编译后taget->classes里的路径名是否存在,存在为true,加载配置

import com.it.mhh.entry.Student;

import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class CustomConditionOnResource {

@Bean

//指定的资源文件出现在classpath中生效(就数编译后target里classes里的包路径)

@ConditionalOnResource(resources = "com\\it\\mhh")

//这里就是判断是否吧此对象注入IOC,ClassCondition此类matches对象的返回的Boolean[true:创建,false:不创建]

public Student getStudent() {

return new Student();

}

}

4.启动类测试

@ConditionalOnResource()//指定的资源文件出现在classpath中生效(就数编译后target里classes里的包路径)

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication

//@ConditionalOnResource()//指定的资源文件出现在classpath中生效(就数编译后target里classes里的包路径)

public class ConditionApplication {

public static void main(String[] args) {

ConfigurableApplicationContext run = SpringApplication.run(ConditionApplication.class, args);

//Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'getStudent' available[表示没有获取到这个bean]

Object getStudent = run.getBean("getStudent");//这里因为是注入ioc时 @Bean没有指定名字,则就是方法名从ioc中获取此对象

System.out.println(getStudent);

}

}

链接:condition包下常用注解案例源代码下载地址

相关内容

绝活的绝是什么意思 绝活的绝什么意思
国内365bet登录网址

绝活的绝是什么意思 绝活的绝什么意思

⌛ 07-22 👁️ 8679
苛昕名字的含义与寓意
国内365bet登录网址

苛昕名字的含义与寓意

⌛ 07-13 👁️ 455
奋衅的解释及意思
国内365bet登录网址

奋衅的解释及意思

⌛ 07-21 👁️ 9151
吟组词有哪些
365bet.com官方网站

吟组词有哪些

⌛ 07-20 👁️ 3935
罗得西亚背脊犬
365提现一般多久到账

罗得西亚背脊犬

⌛ 07-26 👁️ 8899
夏至未至 【所有歌曲】
365bet.com官方网站

夏至未至 【所有歌曲】

⌛ 08-08 👁️ 3194
赛车游戏哪个好玩
365提现一般多久到账

赛车游戏哪个好玩

⌛ 06-28 👁️ 6969
杭州钱景社区:定格幸福瞬间共绘夕阳之美
365bet.com官方网站

杭州钱景社区:定格幸福瞬间共绘夕阳之美

⌛ 08-16 👁️ 5511