SpringBoot中的Condition包下常用条件依赖注解案例介绍

目录
  • 一、@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置
    • 1.首先引入pom依赖
    • 2.实体类测试对象
    • 3.定义@ConditionalOnClass()配置类
    • 4.启动类测试
  • 二、注入指定配置
    • 1.首先引入pom依赖
    • 2.实体类测试对象
    • 3.定义@ConditionalOnMissingClass()配置类
    • 4.启动类测试
  • 三、加载指定配置
    • 1.首先引入pom依赖
    • 2.实体类测试对象
      • 2.1 引入条件判断实体类
    • 3.定义@ConditionalOnBean()配置类
    • 4.启动类测试
  • 四、ioc中判断
    • 1.首先引入pom依赖
    • 2.实体类测试对象
      • 2.1 引入条件判断实体类
    • 3.定义@ConditionalOnMissingBean()配置类
    • 4.启动类测试
  • 五、@ConditionalOnProperty()加载配置
    • 1.首先引入pom依赖
    • 2.实体类测试对象
    • 3.定义@ConditionalOnProperty() 配置类
    • 4.application.yml配置
    • 5.启动类测试
  • 六、@ConditionalOnExpression() 配置文件
    • 1.首先引入pom依赖
    • 2.实体类测试对象
    • 3.定义@ConditionalOnExpression() 配置类
    • 4.application.yml配置
    • 5.启动类测试
  • 七、@ConditionalOnResource() 指定的资源文件出现在classpath中生效
    • 1.首先引入pom依赖
    • 2.实体类测试对象
    • 3.定义@ConditionalOnResource()配置类
    • 4.启动类测试

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

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

1.首先引入pom依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--用json来判断是否创建bean-->
	<dependency>
   		<groupId>com.alibaba</groupId>
   	 	<artifactId>fastjson</artifactId>
   		<version>1.2.71</version>
	</dependency>
</dependencies>

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依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--用json来判断是否创建bean-->
<!--<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.71</version>
</dependency>-->
</dependencies>

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依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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}
    }
}

四、ioc中判断

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

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

1.首先引入pom依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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()加载配置

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

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

1.首先引入pom依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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() 配置文件

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

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

1.首先引入pom依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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依赖

<!--引入springboot父依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
</parent>
<dependencies>
    <!--引入启动器依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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.定义@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);
    }
}

到此这篇关于SpringBoot中的Condition包下常用条件依赖注解案例介绍的文章就介绍到这了,更多相关SpringBoot条件依赖注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-04-19

基于SpringBoot核心原理(自动配置、事件驱动、Condition)

前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理.如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动.自动配置.Condition.事件驱动原理. 正文 启动原理 SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可: @SpringBootApplication(scanBas

如何使用SpringBootCondition更自由地定义条件化配置

Conditional如何使用 @Conditional 是 SpringFramework 的功能, SpringBoot 在它的基础上定义了 @ConditionalOnClass , @ConditionalOnProperty 的一系列的注解来实现更丰富的内容. 定义一个自定义标签 import com.example.conditional.MyConditional; import org.springframework.context.annotation.Conditional;

SpringBoot自动装配Condition的实现方式

目录 1. 简介 2. 定义 2.1 @Conditional 2.2 Condition 3. 使用说明 3.1 创建项目 3.2 测试 3.3 小结 4. 改进 4.1 创建注解 4.2 修改UserCondition 5. Spring内置条件注解 1. 简介 @Conditional注解在Spring4.0中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean. 2. 定义 2.1 @Conditional @Conditional注解定义如下:其内部只有一个参数

springboot @ConditionalOnMissingBean注解的作用详解

@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员. 代码演示 @Component public class AutoConfig { @Bean public AConfig aConfig() { return new AConfig("lind"); } @B

浅谈SpringBoot中的@Conditional注解的使用

概述 Spring boot 中的 @Conditional 注解是一个不太常用到的注解,但确实非常的有用,我们知道 Spring Boot 是根据配置文件中的内容,决定是否创建 bean,以及如何创建 bean 到 Spring 容器中,而 Spring boot 自动化配置的核心控制,就是 @Conditional 注解. @Conditional 注解是 Spring 4.0 之后出的一个注解,与其搭配的一个接口是 Condition,@Conditional 注解会根据具体的条件决定是否

浅谈springboot中tk.mapper代码生成器的用法说明

问:什么是tk.mapper? 答:这是一个通用的mapper框架,相当于把mybatis的常用数据库操作方法封装了一下,它实现了jpa的规范,简单的查询更新和插入操作都可以直接使用其自带的方法,无需写额外的代码. 而且它还有根据实体的不为空的字段插入和更新的方法,这个是非常好用的哈. 而且它的集成非常简单和方便,下面我来演示下使用它怎么自动生成代码. pom中引入依赖,这里引入tk.mybatis.mapper的版本依赖是因为在mapper-spring-boot-starter的新版本中没有

浅谈SpringBoot 中关于自定义异常处理的套路

在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有一些默认的策略,我们分别来看. 默认情况下,Spring Boot 中的异常页面 是这样的: 我们从这个异常提示中,也能看出来,之所以用户看到这个页面,是因为开发者没有明确提供一个 /error 路径,如果开发者提供了 /error 路径 ,这个页面就不会展示出来,不过在 Spring Boot 中

浅谈SpringBoot处理url中的参数的注解

1.介绍几种如何处理url中的参数的注解 @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写 (1)PathVaribale 获取url中的数据 看一个例子,如果我们需要获取Url=localhost:8080/hello/id中的id值,实现代码如下: @RestController public class Hello

浅谈springboot项目中定时任务如何优雅退出

在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生效. 启动类 启动类上我们获取到相应的上下文,捕捉相应命令.在这里插入代码片 @SpringBootApplication /**指定mapper对应包的路径*/ @MapperScan("com.youlanw.kz.dao") /**开启计划任务*/ @EnableScheduling

浅谈Java中注解Annotation的定义、使用、解析

此例子,用于说明如何在Java中对"注解 Annotation"的定义.使用和解析的操作.注解一般用于自定义开发框架中,至于为什么使用,此处不作过多说明,这里只说明如何使用,以作备记.下面例子已测试,可以正常运行通过. 1.注解自定义. 这里定义两个注解,分别用来注解类和注解属性. package cc.rulian.ann; import java.lang.annotation.ElementType; import java.lang.annotation.Retention;

浅谈spring-boot的单元测试中,@Before不被执行的原因

我们先来看下笔者的单元测试的依赖版本: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from reposi

浅谈Spring中@Import注解的作用和使用

@Import用来导入@Configuration注解的配置类.声明@Bean注解的bean方法.导入ImportSelector的实现类或导入ImportBeanDefinitionRegistrar的实现类. @Import注解的作用 查看Import注解源码 /** * Indicates one or more {@link Configuration @Configuration} classes to import. * * <p>Provides functionality eq

浅谈SpringBoot主流读取配置文件三种方式

读取配置SpringBoot配置文件三种方式 一.利用Bean注解中的Value(${})注解 @Data @Component public class ApplicationProperty { @Value("${application.name}") private String name; } 该方式可以自动读取当前配置文件appliation.yml  或者application.properties中的配置值 区别在于读取yml文件时候支持中文编码,peoperties需

浅谈SpringMVC中的session用法及细节记录

前言 初学SpringMVC,最近在给公司做的系统做登录方面,需要用到session. 在网上找了不少资料,大致提了2点session保存方式: 1.javaWeb工程通用的HttpSession 2.SpringMVC特有的@SessionAttributes 我个人比较关注@SessionAttributes的用法,毕竟现在是在用SpringMVC嘛.但是我看网上那些文章,基本都是只说明了基础用法,详细的使用和细节却基本没有,我想这是不够的,所以我自己做了一些测试,然后整理了下代码做了个de