Spring Conditional注解使用小结
今天我们来总结下Conditional注解的使用。
Conditional注解
增加配置类Config
package condition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
/**
* @author yaojiafeng
* @create 2017-09-05 下午4:12
*/
@Configuration("config")
@Conditional(ConditionImpl.class)
public class Config {
@Bean
public String createString() {
System.out.println("======000");
return "String";
}
}
增加Condition实现类ConditionImpl
package condition;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author yaojiafeng
* @create 2017-09-05 下午4:11
*/
public class ConditionImpl implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
编写测试类Main
package condition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author yaojiafeng
* @create 2017-09-05 下午4:18
*/
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(Config.class);
context.refresh();
Object config = context.getBean("config");
System.out.println(config);
}
}
当调用context.register(Config.class)方法时,内部会调用方法。
public void registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers) {
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
return;
}
......
这里首先会执行conditionEvaluator.shouldSkip方法,这里面就是判断是否有Conditional注解,没有不需要跳过,有的话执行配置的条件类的matches方法,如果有一个类返回false,则跳过这个配置Bean(不加入到BeanDefinitionMap)。
把上面的matches方法返回值改为false,则会找不到这个配置Bean。
把Conditional注解配置在方法上也是一样的效果,因为在装载这个MethodBean的时候,也会调用ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod方法判断是否需要跳过这个MethodBean。
@Bean("String")
@Conditional(ConditionImpl.class)
public String createString() {
System.out.println("======000");
return "String";
}
下面是一些springboot的演变注解
ConditionalOnClass注解
在Config类上加ConditionalOnClass注解
@Configuration("config")
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class })
public class Config {
@Bean("String")
public String createString() {
System.out.println("======000");
return "String";
}
}
registerBean的时候会递归查询是否包含Conditional注解,并取出他的配置Condition实现类,调用matches方法判断是否需要跳过。
ConditionalOnProperty注解
这个注解也是解析是否存在配置属性
@Configuration("config")
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class Config {
@Bean("String")
public String createString() {
System.out.println("======000");
return "String";
}
}
其余类似的Conditional注解的解析过程大同小异,都有各自的Condition实现类,我们也可以自定义实现一套规则匹配。
Spring Conditional注解使用小结的更多相关文章
- Spring @Conditional注解 详细讲解及示例
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xcy1193068639/article/details/81491071 前言: @Conditi ...
- Spring的注解@Qualifier小结
有以下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); } 有两个实现类: @Se ...
- Spring @Conditional注解的使用
Spring Boot的强大之处在于使用了Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置. 下面来介绍如何使用Condition 首先写一个类 ...
- Spring @Conditional简单使用 以及 使用时注意事项一点
@Conditional注解在类的方法中 @Conditional注解失效的一种原因 @Conditional注解在类上 手写的低配版@ConditionalOnClass Spring @Cond ...
- 一文了解@Conditional注解说明和使用
@Conditional:Spring4.0 介绍了一个新的注解@Conditional,它的逻辑语义可以作为"If-then-else-"来对bean的注册起作用. @Con ...
- SpringBoot(15)—@Conditional注解
SpringBoot(15)-@Conditional注解 作用 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean. 一.概述 1 ...
- spring 3.x变通实现@Conditional注解的功能
在某些情况下,我们要根据当前的系统配置决定是否初始化一个bean,也就是条件性加载,比如本地缓存或者分布式缓存,亦或是采用http实现或者socket实现.在spring 4.x中,可以使用新增的@C ...
- Spring中的@conditional注解
今天主要从以下几方面来介绍一下@Conditional注解 @Conditional注解是什么 @Conditional注解怎么使用 1,@Conditional注解是什么 @Conditional注 ...
- spring in action学习笔记七:@Conditional注解的用法
@Profile注解是@Conditional注解的一个例子.即@Profile也是用@Conditional注解来实现的. 必须让条件实现Condition这个接口. 下面的案例讲如果环境中有mag ...
随机推荐
- Scrapy 框架 配置文件
配置文件 基本配置 #1.项目名称,默认的USER_AGENT由它来构成,也作为日志记录的日志名 BOT_NAME = 'Amazon' #2.爬虫应用路径 SPIDER_MODULES = ['Am ...
- IP地址及网络常识
一.IP 互联网网络协议(internret protocol address ,IP),IP地址是IP协议提供的一种统一的标准化的地址格式,它会为互联网中的每个网络和每台主机备提供一个逻辑地址,来区 ...
- Java【初识篇】语言概述
什么是计算机语言 语言:是人与人之间用于沟通的一种方式.例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语.计算机语言(编程语言):人与计算机交流的方式.如果人要与计算机交流,那么 ...
- 20165223 《信息安全系统设计基础》 实现mybash
一.了解 mybash 1. 简介 bash 是 Bourne Again Shell 的缩写,是linux默认的标准shell(也是大家常说的系统内核),bash也是Unix/Linux上常见的 ...
- npm后台启动nuxt服务之 kill
后台启动 npm run start & ps aux | grep start 根据项目对应的id执行如下命令 kill xxxx
- laravel 图片验证码
今天看见一个网站登录页面有个图片验证码,想想自己以前好像真没弄过这个玩意,正好现在有时间,准备用laravel来弄个图片验证码出来,不多BB,直接上代码 1.直接使用别人封装好的,composer下载 ...
- eMMC真能优化成UFS?谈谈手机闪存的文件系统
和UFS闪存相比,eMMC的性能更弱,同一型号的手机混用这两种规格的闪存,让一些消费者感到了不满.对此,厂商称通过优化,eMMC的产品也可以获得优秀的体验.这个优化到底是怎么回事?根据以往的一些宣传, ...
- 爬虫案例之Pubmed数据库下载
代码 # encoding=utf-8 import os, time, re import urllib.request import urllib.parse import ssl ssl._cr ...
- 静态IP设置
先查看自动网络的ip地址,然后设置 cmd进入DOS输入命令:ipconfig /all 设置固定IP
- 个人认为一个比较完整,基于tp5平台,可快速开发的B2C平台
现在全民创业,做电商的人很多,大大小小的技术公司也很多,报价也很奇葩,从100到十万的都有,把人都能转晕,有朋友问我,你们创业是不是很赚钱,其实,外行不知道内行的苦,创业控制成本第一,活下来才能赚钱. ...