Springboot Condition 实用讲解,只看一遍包学会,2024年最新数据结构算法常见面试考题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • @Description 召唤神龙的条件

  • @Date 2021/10/19 10:03

*/

public class DragonCondition implements Condition {

@Override

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

if (7 == Integer.parseInt(Objects.requireNonNull(context.getEnvironment().getProperty(“summon.dragon-ball”)))){

return true;

}

return false;

}

}

接下来,我们来测试一下,

我们在yml文件添加配置项:

summon:

dragon-ball: 7

然后到测试类里面简单写个测试方法,看看Dragon 这个bean是否能成功被创建 :

import com.elegant.testdemo.happy.Dragon;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest

class TestdemoApplicationTests {

@Autowired(required = false)

//Autowired 设置为false,允许注入的时候找不到的情况,不会报错

private Dragon dragon;

@Test

void contextLoads() {

System.out.println(dragon);

}

}

执行,可以看到,因为我们条件匹对符合,神龙bean能成功创建:

那么我们把配置里面的龙珠颗树参数改一下,改成 5 :

到这里,其实 基本的Condition 配合 @Conditional 注解的使用已经掌握了。


那么接下来,继续,我们开始玩一下这个派生注解:

@ConditionalOnBean:当容器中有指定Bean的条件下进行实例化。

@ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。

@ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。

@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。

@ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。

@ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。

@ConditionalOnProperty:当指定的属性有指定的值时进行实例化。

@ConditionalOnExpression:基于SpEL表达式的条件判断。

@ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。

@ConditionalOnResource:当类路径下有指定的资源时触发实例化。

@ConditionalOnJndi:在JNDI存在的条件下触发实例化。

@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。


接下来我挑选几个常用的细细说说,

@ConditionalOnProperty : 当指定的属性有指定的值时进行实例化。

也就是说,我们可以让某个bean创建时,进行 配置值的匹对,符合条件了才能正常创建。

实践环节


单值匹对

示例:

RoleInitializer 这个bean,如果想让它正常实例化,我们需要检测yml配置文件里面,app.public的值是否为 true :

yml配置文件我们添加配置值:

启动项目,可以看到这个bean是符合条件的成功实例化:

我们把yml的值改一下:

再启动项目,可以看到这个bean没有被实例化,因为不符合条件:

ps:到这,也许会有一些看官会有想法:

这样的使用注解去检测yml里面的值,跟我们直接拉去配置文件的值,写个if判断 不是一样吗?

答案: 看似一样,实则并不。 硬编码的概念。 实例化和没实例化的区别。 不多说。


还没完, 上面是 @ConditionalOnProperty比较简单的使用例子,单纯一个配置值的匹对。

接下来是多值匹对场景

示例 :

RoleInitializer 这个bean,如果想让它正常实例化,我们需要检测yml配置文件里面,app.public的值是否为 true 且 app.vip 的值 也为 true:

关系是 且 ,也就是AND ,同时符合的概念,我们可以这么写:

@ConditionalOnProperty(name={“app.public”,“app.vip”}, havingValue=“true”)

@ConditionalOnProperty的注解能够支撑的、常用的方式也就差不多这些,更多元化的匹对效果是无法支持的,例如我们想要 匹对条件值A 为 1 同时 B 为  2 ,这种情形就已经无法支撑了。

不过我们可以换个概念表达,变成 匹对条件值AB 为 12 .

而且再补充一点,目前@ConditionalOnProperty的使用都是 且 (AND) 关系,如果你要用OR的方式的条件,那么也是很 sorry,@ConditionalOnProperty 支撑不了。

除非我们使用文章一开始介绍的自定义condition,完全是ok的。

那么就只能用自定义condition去实现这些多条件的匹对场景了吗?

答案是 : 并不 ,接下来看@ConditionalOnExpression 注解。

@ConditionalOnExpression :基于SpEL表达式的条件判断。

也是可以用于对配置文件的属性做一些匹对条件,但是功能强大很多。

就基于上面说到的例子,我们如果需要匹对的条件是多值:

app.public 值为 true  且 app.vip 值为 high 时 ,才能正常实例化RoleInitializer这个bean。

那么使用@ConditionalOnExpression ,我们可以这么写:

@ConditionalOnExpression(“'KaTeX parse error: Expected 'EOF', got '&' at position 26: ….equals('high')&̲&{app.public:true}”)

从这,引申出一些 用法 的介绍:

如果我们想匹配的配置项的值 是字符串类型 ,我们写法是:

@ConditionalOnExpression(“‘${app.public}’.equals(‘JC’)”)

如果是 数字类型 ,我们写法是:

@ConditionalOnExpression(“${app.public}==18”)

如果是 布尔类型 ,我们写法是:

@ConditionalOnExpression(“${app.public:true}”)

那么还有 与 关系 写法,使用  && :

@ConditionalOnExpression(“'KaTeX parse error: Expected 'EOF', got '&' at position 26: ….equals('high')&̲&{app.public:true}”)

或 关系 写法,使用  || :

@ConditionalOnExpression(“${app.public:true} || ${app.vip:true}”)

继续下一个 ,

@ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。

基于文章一开始的 Dargon示例我们继续 使用一下这个注解,

模拟场景:

如果  Dargon 神龙没有符合条件实例化成功,那么我们自动召唤 阿拉丁神灯 作为备用。

DragonCondition 自定义的实例化条件,回顾一下:

总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

请转发本文支持一下

[外链图片转存中…(img-Qqp89h34-1713572231736)]

[外链图片转存中…(img-wIbs7pSM-1713572231736)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-OgxdXmt1-1713572231737)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值