浅析SpringBoot2底层注解@Conditional@ImportResource(springboot的三个注解)

网友投稿 342 2022-07-27


目录SpringBoot2底层注解一、@ImportResource示例二、@ImportResource

SpringBoot2底层注解

一、@ImportResource

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

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

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

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

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

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

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

@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);

}

}

运行一下,查看结果:

果然,是不存在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个组件都不存在。

作用在类上

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

@ConditionalOnBean(name = "pet1") // 放在类上

@Import({User.class, DBHelper.class})

@Configuration(proxyBeanMethods http://= 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 的组件:" +gXqnHbMi pet22);

... ...

运行一下:

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

二、@ImportResource

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

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

... ...

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

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

boolean haha = run.containsBean("haha");

System.out.println("容器中存在 haha 的组件:" + haha);

boolean hehe = run.containsBean("hehe");

System.out.println("容器中存在 hehe 的组件:" + hehe);

因为这些组件声明在 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");

}

}

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

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot整合RabbitMQ处理死信队列和延迟队列(springboot整合rabbitmq的持久化)
下一篇:详解RabbitMQ中死信队列和延迟队列的使用详解(rabbitmq死信队列和延时队列)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~