首页 > 其他分享 >SpringBoot学习(8)(Bean注册条件)(@Conditional的衍生注解)

SpringBoot学习(8)(Bean注册条件)(@Conditional的衍生注解)

时间:2024-09-06 21:22:21浏览次数:12  
标签:Province SpringBoot 配置文件 Conditional Bean 注册 注解 注入

目录

一、引言

二、案例引用(接着上篇博客)

三、注册条件

(1)@ConditionalOnProperty

(2)Conditional0nMissingBean

(3)@ConditionalOnclass

四、总结

一、引言

  • 之前学习和了解了Bean对象的注册。其中涉及注解有@Bean与@Import。
  • Bean管理的第三个部分——>注册条件

二、案例引用(接着上篇博客)

  • 接着上篇博客的学习,我想获取第三方jar包中实体类的对应的已经注入到Ioc容器的Bean对象的具体成员变量的值
  • 这里用到注解@Value。把配置文件里面的信息读取程序里面使用。因为在程序中不能把信息写死了。而这个注解可以获取配置文件里的指定键对应的值。之前它用在成员变量上了,现在它也可以用在参数列表上。


@Value("${country.对应键名}")


  • yml配置文件中的内容

  • 如果我把配置文件里面的内容注释掉,再重新启动运行工程就会报错。因为前面用注解告诉springboot从配置文件里面读取(country.name与country.system),结果删除了就不能解析到它。
  • 而我们正常的设置应该是这样:如果配置文件里面书写了对应的内容,就正常解析。如果没有写任何的东西,就不再注入country对象。如何做?这就要用到注册条件了。

三、注册条件

  • SpringBoot提供了设置注册生效条件的注解@Conditional。我们可以借助于这个注解来设置Bean注册的条件,但是这个注解比较麻烦。所以要使用其更简单的衍生注解。

  • 这类衍生的注解有很多,以下列出三个常用的注解以及说明
@Conditional的常用衍生注解
注解说明
@ConditionalOnProperty配置文件中存在对应的属性,才声明该bean
@Conditional0nMissingBean当不存在当前类型的bean时,才声明该bean
@ConditionalOnclass当前环境存在指定的这个类时,才声明该bean
  • 回到IDEA继续尝试使用上述衍生注解
(1)@ConditionalOnProperty

(配置文件中存在对应的属性,才声明该bean)

  • 首先使用注解@ConditionalOnProperty,这个注解有两个属性需要赋值。


  • 添加这个注解后(如果没有前缀country,name属性是指定键名,也就是country下有name、system都配置好了才注入Country类的Bean对象,否则不注入)

 
  • 此时再去启动类中获取并打印这个Bean对象就报错,因为前面注解判断条件生效,并没有注入进Ioc容器(测试成功)只要把配置文件的注释取消掉,再重新运行就可以了。

(2)Conditional0nMissingBean

(当不存在当前指定类型的Bean时,才声明和注入该Bean)

  • 测试:如果Ioc容器中不存在已经注入好的Country,则注入Province,否则不注入。
  • 首先前面yml配置文件注释去掉,然后Country已经注入到Ioc容器中




  • 此时再把yml配置文件中的内容注释掉,这样就会因为注解@ConditionalOnProperty的注册条件生效,就不会注册Country的Bean对象。然后又因为注解@Conditional0nMissingBean的原因,判断条件生效,没有已经注入的Country就会注册Province的Bean对象,然后springboot的启动类就可以获取到Ioc容器里面的Province的Bean对象了。

(3)@ConditionalOnclass

(当前环境存在指定的这个类时,才声明该bean)

  • 测试:如果当前环境中存在:"DispatcherServlet类",则注入Province,否则不注入。而这个类"DispatcherServlet"是当工程引入了web的起步依赖,则当前环境中会存在这个类,否则就没有。
  • 首先我的pom文件里面并没有引入web的起步依赖。
  • 然后我在使用这个注解@ConditionalOnclass的时候,要写指定类的全类名——>对应的一个属性值要声明"name"。这里采用双击shift,搜索全类名,像下面一样的操作步骤



  • 如果没有web的起步依赖,就没有上面那个类DispatcherServlet

  • 然后接下来用注解注册Bean的判断条件,如果环境中存在这个类,就注册Province的Bean对象。

  • 显而易见会报错!!因为未引入web起步依赖,环境中不存在该类,它就获取不到Ioc容器中的Province的Bean对象

  • 现在测试当pom文件中引入了web的起步依赖,记得刷新Maven。就成功了,不报错!


四、总结

(1)学习的有关于Bean注册条件的相关注解,通常会在自定义starter、或者是学习springboot源码中看到。

(2)主要涉及到的相关注解:@Bean、自定义组合注解、@Conditional及其衍生注解:@ConditionalOnProperty、@Conditional0nMissingBean、@ConditionalOnclass。

标签:Province,SpringBoot,配置文件,Conditional,Bean,注册,注解,注入
From: https://blog.csdn.net/m0_74363339/article/details/141958063

相关文章

  • 基于SpringBoot的校园闲置物品交易网站
    你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。开发语言:Java数据库:MySQL技术:SpringBoot框架工具:MyEclipse、Tomcat系统展示首页管理员功能模块用户功能模块收藏地址摘要随着互联网技术的快速发展,网络交易逐渐成为人们生活中的一部分。校园闲......
  • 基于SpringBoot的校园疫情防控系统
    你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis工具:MyEclipse、Navicat、Maven系统展示首页管理员功能模块学生前后台功能模块系统测试摘要随着2019年12月19日新冠病毒的出现,校园疫情防控成为......
  • SpringBoot本地项目上传到服务器
    首次将本地springboot开发的项目上传到服务器,这里连接服务器操作系统是windowserver,特此记录流程以备不时之需。基本步骤:打包项目为jar包上传项目启动服务    1.本地测试无bug后,打开idea右侧maven面板,清空本地编译文件,在pom文件中设置导报方式为jar,重新打......
  • springboot 常用的验证框架分析 -shiro/springsecurity
    一 常用的认证鉴权框架关于认证和鉴权的框架,在springboot中使用比较多的比如shiro,springsecurity,soToken这些。从设计上,这些框架的底层逻辑其实大同小异。整体上来说:对于保护性的安全资源,用户需要先通过认证,才能获取授权访问,所以通过理解,很容易思考到,所有的权限管理框架。......
  • 基于springboot武警警官学院训练场地管理系统的计算机毕设
    摘要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用java技术建设训练场地管理系统。本毕业设计主要实现集人性化、高效率、便捷等优点于一身的训练场地管理......
  • (免费源码)计算机毕业设计必看必学 原创定制程序 java、PHP、python、小程序、文案全套
    摘 要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设英语自主学习平台。本设计主要实现集人性化、高效率、便捷等优点于一身的英语自......
  • 基于springboot图书推荐管理系统的设计与实现的计算机毕设
    图书推荐管理系统的设计与实现摘 要图书推荐管理系统的建设主要是为了使用户方便的借阅图书馆图书,使管理员快速、简单的对图书馆图书及用户信息进行管理,实现在线的借阅与图书、用户管理,充分利用网络的方便快捷、时时互动的特点,打破传统的手工操作模式,提出新颖的模式,使用户在网络......
  • 基于Node.js+vue基于SpringBoot的旅游直通车(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,人们对旅游出行的便捷性、个性化及服务质量的要求日益提高。传统的旅游服务模式已难以满足现代游客对高效、灵活、一站式旅游体验的需......
  • 基于Node.js+vue基于SpringBoot的个人健康管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人们健康意识的日益增强,个人健康管理已成为社会关注的焦点。传统的健康管理方式往往依赖于医院或体检中心的定期检查,这种方式不仅......
  • Springboot 读取文件并是实现浏览器下载
    添加依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>2.编写controllerimportorg.spr......