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

目录

一、引言

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

三、注册条件

(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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot中,@Conditional注解和@AutoConfigureAfter注解是非常常用的注解,下面我来给你详细解析一下这两个注解。 ## @Conditional注解 @Conditional注解Spring Boot中非常重要的一个注解,在Spring Boot中,很多自动配置都是通过@Conditional注解来实现的。 @Conditional注解可以根据满足某些条件来决定是否创建一个bean。比如,我们可以根据某个类是否存在来决定是否创建一个bean,具体示例如下: ```java @Configuration @Conditional(ExistClassCondition.class) public class MyConfiguration { @Bean public MyBean myBean() { return new MyBean(); } } public class ExistClassCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { try { Class.forName("com.example.MyClass"); return true; } catch (ClassNotFoundException e) { return false; } } } ``` 上面的代码中,我们定义了一个MyConfiguration类,并且在该类上加了@Conditional注解,该注解的参数是一个Condition的实现类ExistClassCondition。ExistClassCondition类中的matches方法返回true的条件是com.example.MyClass类存在。 这样,当com.example.MyClass类存在的时候,MyBean这个bean才会被创建。否则,MyBean这个bean不会被创建。 ## @AutoConfigureAfter注解 @AutoConfigureAfter注解也是Spring Boot中比较常用的注解之一,它可以用来控制自动配置的顺序。 比如,我们可以通过@AutoConfigureAfter注解来控制某个自动配置类在另一个自动配置类之后加载,具体示例如下: ```java @Configuration @AutoConfigureAfter(MyAutoConfiguration.class) public class MyAnotherAutoConfiguration { // ... } ``` 上面的代码中,我们定义了一个MyAnotherAutoConfiguration类,并且在该类上加了@AutoConfigureAfter注解,该注解的参数是MyAutoConfiguration.class。这样,在Spring Boot启动时,MyAutoConfiguration这个自动配置类会先于MyAnotherAutoConfiguration这个自动配置类被加载。 总结:@Conditional注解和@AutoConfigureAfter注解都是Spring Boot中非常实用的注解。通过@Conditional注解可以实现根据满足某些条件来决定是否创建一个bean,通过@AutoConfigureAfter注解可以控制自动配置类的加载顺序,这些都是我们在实际开发中非常常用的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁岁岁平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值