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 ...
 
随机推荐
- codeforces487A
			
Fight the Monster CodeForces - 487A A monster is attacking the Cyberland! Master Yang, a braver, is ...
 - linux服务端日志中截取自己所需要的部分
			
近期开发一个图片处理的业务,涉及base64字符串解析的问题,为方便与友商间接口调试,日志中保存Base64.日,想想就肝儿疼,记录下来容易,取的时候难.为准确提取,配合两条命令即可. 1.获取日志所 ...
 - Python 面向对象高阶-----metaclass
			
Python 面向对象高阶-----metaclass 前言 类也是对象,既然类是对象,那就自然是某个东西的实例化,这个东西就是type 首先看下type是怎么回事 type type最常用的方法就是 ...
 - dajngo cache,throttling
			
缓存 背景介绍: 动态网站的问题就在于它是动态的. 也就是说每次用户访问一个页面,服务器要执行数据库查询,启动模板,执行业务逻辑以及最终生成一个你所看到的网页,这一切都是动态即时生成的. 从处理器资源 ...
 - Zookeeper分布式集群原理与功能
			
Zookeeper功能简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现. 分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅 ...
 - java实现文件的断点续传
			
java实现文件的断点续传: 依赖: <!--文件上传--> <dependency> <groupId>commons-fileupload</groupI ...
 - A fine property of the convective terms of axisymmetric MHD system, and a regularity criterion in terms of $\om^\tt$
			
In [Zhang, Zujin; Yao, Zheng-an. 3D axisymmetric MHD system with regularity in the swirl component o ...
 - 分享一个jsonp劫持造成的新浪某社区CSRF蠕虫
			
最近jsonp很火,实话说已经是被玩烂了的,只是一直没有受到大家的重视.正好在上个月,我挖过一个由于jsonp造成的新浪某社区CSRF,当时是为了准备一篇文章,之后这篇文章也会拿出来分享. 因为新浪已 ...
 - artDialog记录
			
//在子页面加按钮的方式 var api = frameElement.api, W = api.opener; api.button({ id: 'valueOk', name: '确定', cal ...
 - mvc 在弹出框中实现文件下载
			
var myParent = parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent; ...