服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 浅析SpringBoot2底层注解@Conditional@ImportResource

浅析SpringBoot2底层注解@Conditional@ImportResource

2022-12-29 16:29把苹果咬哭的测试笔记 Java教程

这篇文章主要为大家介绍了SpringBoot2底层注解@Conditional@ImportResource的分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

SpringBoot2底层注解

一、@ImportResource

@Conditional注解,是根据条件进行装配。满足了 Conditional 指定的条件,就进行组件的注入。

另外@Conditional是个根注解,在idea里使用 ctrl+H 可以打开它的结构。

浅析SpringBoot2底层注解@Conditional@ImportResource

可以看到有许多的派生注解,每个注解都代表着一种功能。比如:

@ConditionalOnBean:当容器中存在指定的组件,才会做某些事情。

@ConditionalOnMissingBean:当容器中没有指定的组件,才会做某些事情。

@ConditionalOnClass:当容器中存在指定的类。

@ConditionalOnMissingClass:当容器中不存在指定的类。

@ConditionalOnResource:项目类路径里存在某个资源的时候。

@ConditionalOnJava:当是指定的 java 版本号。

@ConditionalOnWebApplication:当应用是一个 web 应用的时候。

@ConditionalOnNotWebApplication:当应用不是一个 web 应用的时候。

@ConditionalOnProperty:当配置文件里存在指定属性的时候。

示例

以@ConditionalOnBean为例,演示一下用法。

还是看一下之前 MyConfig 类中的方法:

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
  @Bean("user1")
  public User user01(){
      User pingguo = new User("pingguo",20);
      pingguo.setPet(tomcatPet());
      return pingguo;
  }
//    @Bean("pet1")
  public Pet tomcatPet(){
      return new Pet("tomcat");
  }
}

在这里,我把pet1这个组件给注释掉,现在tomcatPet()其实就是个普通的类方法。

先尝试在主运行类的 main 方法里获取一下 这 2 个 组件:

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
  public static void main(String[] args) {
      // 返回IOC容器
      final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
      boolean tomcatPet = run.containsBean("pet1");
      System.out.println("容器中存在 pet1 的组件:" + tomcatPet);
      boolean user1 = run.containsBean("user1");
      System.out.println("容器中存在 user1 的组件:" + user1);
  }
}

运行一下,查看结果:

浅析SpringBoot2底层注解@Conditional@ImportResource

果然,是不存在pet1组件的,因为@bean这个注解被我注释掉了。

OK,现在我有个需求,因为user1组件依赖pet1组件,如果没有pet1,我希望user1组件也直接别注册了。

这时候就可以使用@ConditionalOnBean注解来完成。

@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
  @ConditionalOnBean(name = "pet1")
  @Bean("user1")
  public User user01(){
      User pingguo = new User("pingguo",20);
      pingguo.setPet(tomcatPet());
      return pingguo;
  }
//    @Bean("pet1")
  public Pet tomcatPet(){
      return new Pet("tomcat");
  }
}

在 user1组件上加上@ConditionalOnBean(name = "pet1"),当没有pet1组件,就不注册user1组件。

现在再运行 main 方法测试一下,应该都是 false,2个组件都不存在。

浅析SpringBoot2底层注解@Conditional@ImportResource

作用在类上

@ConditionalOnBean(name = "pet1")如果我放在类上:

@ConditionalOnBean(name = "pet1") // 放在类上
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
  @Bean("user1")
  public User user01(){
      User pingguo = new User("pingguo",20);
      pingguo.setPet(tomcatPet());
      return pingguo;
  }
  @Bean("pet22")
  public Pet tomcatPet(){
      return new Pet("tomcat");
  }
}

现在就表示,当存在pet1组件的时候,这个类下面的所有才会生效。

这里我改了下面的组件注册变成pet22,也就是说当存在pet1组件的时候,就会注册user1和pet22。

在 main 方法里增加打印pet22,查看是否存在:

... ...
  boolean pet22 = run.containsBean("pet22");
  System.out.println("容器中存在 pet22 的组件:" + pet22);
... ...

运行一下:

浅析SpringBoot2底层注解@Conditional@ImportResource

因为不存在pet1这个组件,所有MyConfig类下面的2个组件user1和pet22的注册都不生效。

二、@ImportResource

@ImportResource注解是用来导入资源。

比如,之前我们可能会在 spring 配置文件中写非常多的组件导入:

... ...
  <bean id="haha" class="com.pingguo.boot.bean.User">
      <property name="name" value="pingguo"></property>
      <property name="age" value="20"></property>
  </bean>
  <bean id="hehe" class="com.pingguo.boot.bean.User">
      <property name="name" value="tomcat"></property>
  </bean>

这里只是demo,实际工程中可能会存在很多 bean,如果想要逐个迁移成注解的方式,会很麻烦。

但是现在容器里又是没有这些组件的,在 main 方法里输出测试一下:

boolean haha = run.containsBean("haha");
  System.out.println("容器中存在 haha 的组件:" + haha);
  boolean hehe = run.containsBean("hehe");
  System.out.println("容器中存在 hehe 的组件:" + hehe);

浅析SpringBoot2底层注解@Conditional@ImportResource

因为这些组件声明在 xml 里,springboot 也并不知道这些是干嘛的。

这时候就可以使用@ImportResource来导入这些组件:

//@ConditionalOnBean(name = "pet1")
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)
@ImportResource("classpath:beans.xml")  //配置文件的类路径 
public class MyConfig {
  @Bean("user1")
  public User user01(){
      User pingguo = new User("pingguo",20);
      pingguo.setPet(tomcatPet());
      return pingguo;
  }
  @Bean("pet22")
  public Pet tomcatPet(){
      return new Pet("tomcat");
  }
}

这个时候再运行测试一下:

浅析SpringBoot2底层注解@Conditional@ImportResource

xml 配置文件里的组件被成功解析注册到了容器中。

以上就是浅析SpringBoot2底层注解@Conditional@ImportResource的详细内容,更多关于SpringBoot2底层注解的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/wessonlan/article/details/124812930

延伸 · 阅读

精彩推荐
  • Java教程SpringMVC如何接收参数各种场景

    SpringMVC如何接收参数各种场景

    这篇文章主要介绍了SpringMVC如何接收参数各种场景,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    冲动的仔bb9242022-03-08
  • Java教程Spring官网下载各版本jar包的方法

    Spring官网下载各版本jar包的方法

    这篇文章主要介绍了Spring官网下载各版本jar包的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    啊哈程序7242021-07-28
  • Java教程JavaFX桌面应用未响应问题解决方案

    JavaFX桌面应用未响应问题解决方案

    这篇文章主要介绍了JavaFX桌面应用未响应问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    HiIT青年6652020-07-31
  • Java教程Java基础必学TreeSet集合

    Java基础必学TreeSet集合

    这篇文章主要介绍了Java必学基础TreeSet集合,TreeSet集合实现了SortedSet接口, 可以对集合中元素进行自然排序, 要求集合中的元素必须是可比较的。下文详细介...

    再美不及姑娘你5932022-11-01
  • Java教程SpringBoot与SpringMVC中参数传递的原理解析

    SpringBoot与SpringMVC中参数传递的原理解析

    这篇文章主要介绍了SpringBoot与SpringMVC中参数传递的原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考...

    感谢一切给予9832021-10-26
  • Java教程详解Java中的线程模型与线程调度

    详解Java中的线程模型与线程调度

    这篇文章主要介绍了详解Java中的线程模型与线程调度的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下...

    精灵王9512021-08-04
  • Java教程Java使用poi包读取Excel文档代码分享

    Java使用poi包读取Excel文档代码分享

    这篇文章主要介绍了Java使用poi包读取Excel文档代码分享,具有一定借鉴价值,需要的朋友可以参考下。...

    yan456jie5062021-02-27
  • Java教程Java构造器方法深入理解

    Java构造器方法深入理解

    这篇文章主要介绍了Java构造器方法深入理解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    威斯布鲁克.猩猩11112021-12-31