springboot注解--基础--2.3--ConditionalOnMissingClass

springboot注解–基础–2.3–ConditionalOnMissingClass


代码位置
https://gitee.com/DanShenGuiZu/learnDemo/tree/master/annotation-learn/annotation-learn1

1、介绍

  1. ConditionalOnMissingClass的value对应的String[],都不能在classpath下找到,就构建这个bean。
    1. 也就是说,找不到class文件,就构建bean
  2. 通过class.forName来判断class能不能找到
  3. 通过OnClassCondition.class来判断

1.1、注解内容

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnMissingClass {

	/**
	 * 匹配的类名称 
	 */
	String[] value() default {};

}

1.2、OnClassCondition类关系

在这里插入图片描述

2、测试

在这里插入图片描述

2.1、代码


 
@Configuration
public class TestConfig {
    
    @Bean
    @ConditionalOnClass(Test2.class)
    Test2 test2() {
        System.out.println("---------Test2 的class文件存在,将Test2注册到容器中---------");
        return new Test2();
    }
    
    public class Test2 {
    }
    
    public static void main(String[] args) {
        
        // 设置日志级别,去掉我不要的信息
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        List<Logger> loggerList = loggerContext.getLoggerList();
        loggerList.forEach(logger -> {
            logger.setLevel(Level.ERROR);
        });
        
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
        
    }
}

2.2、测试

在这里插入图片描述

3、原理分析

我们通过类关系图找到Condition接口有个实现抽象类SpringBootCondition,SpringBoot中所有条件注解对应的条件类都继承这个抽象类。它实现了matches方法

在这里插入图片描述

getMatchOutcome是个抽象方法,需要子类去实现

在这里插入图片描述

子类getMatchOutcome方法

在这里插入图片描述

@Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
	//类加载器
	ClassLoader classLoader = context.getClassLoader();
	//条件元信息
	ConditionMessage matchMessage = ConditionMessage.empty();
	//获取ConditionalOnClass注解中value的内容,也就是class的类名全路径
	List<String> onClasses = getCandidates(metadata, ConditionalOnClass.class);
	if (onClasses != null) {
		//如果类名不存在,missing就有内容
		List<String> missing = filter(onClasses, ClassNameFilter.MISSING, classLoader);
		if (!missing.isEmpty()) {
			//返回失败匹配信息
			return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnClass.class)
					.didNotFind("required class", "required classes").items(Style.QUOTE, missing));
		}
		//构建提示消息
		matchMessage = matchMessage.andCondition(ConditionalOnClass.class)
				.found("required class", "required classes")
				.items(Style.QUOTE, filter(onClasses, ClassNameFilter.PRESENT, classLoader));
	}
	//获取ConditionalOnMissingClass注解中value的内容,也就是class的类名全路径
	List<String> onMissingClasses = getCandidates(metadata, ConditionalOnMissingClass.class);
	if (onMissingClasses != null) {
		//如果类名不存在,present就为空
		List<String> present = filter(onMissingClasses, ClassNameFilter.PRESENT, classLoader);
		if (!present.isEmpty()) {
			//如果类名存在,返回失败匹配信息
			return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnMissingClass.class)
					.found("unwanted class", "unwanted classes").items(Style.QUOTE, present));
		}
		matchMessage = matchMessage.andCondition(ConditionalOnMissingClass.class)
				.didNotFind("unwanted class", "unwanted classes")
				.items(Style.QUOTE, filter(onMissingClasses, ClassNameFilter.MISSING, classLoader));
	}
	//返回成功匹配信息
	return ConditionOutcome.match(matchMessage);
}

getCandidates方法

在这里插入图片描述

在这里插入图片描述

filter方法

在这里插入图片描述

当前类不存在,就加入matches列表中

在这里插入图片描述

ClassNameFilter方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
springboot vue-simple-uploader 是一个前后端分离的文件上传插件,在使用前需要进行相关配置和代码的编写。 首先,在后端部分,我们使用的是Spring Boot框架。需要导入spring-boot-starter-web依赖,并在配置文件中配置相关参数,例如设置文件上传临时目录、文件上传大小限制等。然后,我们需要编写一个处理文件上传请求的Controller类,使用@RequestBody注解接收前端传递的文件信息,并使用multipartFile.transferTo()方法保存文件到指定目录中。 在前端部分,我们使用的是Vue.js框架,并引入vue-simple-uploader插件。首先,我们需要安装该插件,可以使用npm安装或者直接引入插件的CDN地址。然后,在Vue实例中,我们可以通过配置uploaderOptions对象来进行插件的相关配置,例如设置上传的url、自定义headers、文件的最大数量和大小限制等。然后,在需要上传文件的组件中,我们可以通过引入uploader组件,并使用v-model绑定上传的文件列表。 通过上述配置和代码编写,我们就可以实现前后端分离的文件上传功能了。当用户选择上传的文件后,前端会将文件信息发送给后端,后端接收到请求后进行文件保存操作,并返回相应的结果给前端,例如文件的保存路径或者上传成功的提示信息。 总结一下,springboot vue-simple-uploader是一个支持前后端分离的文件上传插件,通过在后端配置文件上传参数和编写Controller类,在前端通过配置uploaderOptions对象和使用uploader组件,我们可以实现文件的上传和保存功能。这样,我们就可以方便地在Spring Boot和Vue.js项目中实现文件上传的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值