经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
SpringBoot深入探究@Conditional条件装配的使用
来源:jb51  时间:2022/6/27 12:53:35  对本文有异议

1.相关介绍

@Conditional注解可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足的时候,被@Conditional标注的目标才会被spring容器处理。

比如可以通过@Conditional来控制bean是否需要注册,控制被@Configuration标注的配置类是需要需要被解析等。

Conditional相关的其它注解:

注解描述
@ConditionalOnBean在某个 bean 存在的时候
@ConditionalOnMissingBean在某个 bean 不存在的时候
@ConditionalOnClass当前 classPath 下可以找到某个 class 的时候
@ConditionalOnMissingClass当前 classPath 下无法找到某个 class 的时候
@ConditionalOnResource当前 classPath 下否存在某个资源文件的时候
@ConditionalOnProperty当前 JVM 包含某个属性值的时候
@ConditionalOnWebApplication当前 Spring context 是 web 应用程序的时候
@ConditionalOnJava在指定JDK版本的时候
@ConditionalOnExpression符合表达式的时候
@ConditionalOnJndiJNDI存在该项的时候

2.举例测试

@ConditionalOnBean, 在某个 bean 存在的时候被标注的组件才被注册到IOC容器中

下面是其详细代码

  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Conditional({OnBeanCondition.class})
  5. public @interface ConditionalOnBean {
  6. Class<?>[] value() default {};
  7. String[] type() default {};
  8. Class<? extends Annotation>[] annotation() default {};
  9. String[] name() default {};
  10. SearchStrategy search() default SearchStrategy.ALL;
  11. Class<?>[] parameterizedContainer() default {};
  12. }

我们就拿它来测试一下

1.指定组件不存在时

MyConfig

  1. package com.limi.config;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  4. import org.springframework.context.annotation.*;
  5. @Configuration
  6. public class MyConfig {
  7. // @Bean
  8. // public User user01(){
  9. // return new User(1, "andy", "123456");
  10. // }
  11. @Bean
  12. @ConditionalOnBean(name = "user01") //当user01存在时才注册user02
  13. public User user02(){
  14. return new User(2, "bob", "666666");
  15. }
  16. }

MainApplication

  1. package com.limi;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. @SpringBootApplication
  7. public class MainApplication {
  8. public static void main(String[] args) {
  9. //1、返回我们IOC容器
  10. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
  11. if(run.containsBean("user01"))
  12. System.out.println((User)run.getBean("user01"));
  13. System.out.println("user01 不存在!\n");
  14. if(run.containsBean("user02"))
  15. System.out.println((User)run.getBean("user02"));
  16. else
  17. System.out.println("user02 不存在!\n");
  18. }
  19. }

运行结果

2.指定组件存在时

MyConfig

  1. package com.limi.config;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  4. import org.springframework.context.annotation.*;
  5. @Configuration
  6. public class MyConfig {
  7. @Bean
  8. public User user01(){
  9. return new User(1, "andy", "123456");
  10. @Bean
  11. @ConditionalOnBean(name = "user01") //当user01存在时才注册user02
  12. public User user02(){
  13. return new User(2, "bob", "666666");
  14. }
  15. }

MainApplication

  1. package com.limi;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. @SpringBootApplication
  7. public class MainApplication {
  8. public static void main(String[] args) {
  9. //1、返回我们IOC容器
  10. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
  11. if(run.containsBean("user01"))
  12. System.out.println((User)run.getBean("user01"));
  13. else
  14. System.out.println("user01 不存在!\n");
  15. if(run.containsBean("user02"))
  16. System.out.println((User)run.getBean("user02"));
  17. else
  18. System.out.println("user02 不存在!\n");
  19. }
  20. }

运行结果

3.完整代码

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.limi</groupId>
  7. <artifactId>springboot-test1</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.3.4.RELEASE</version>
  14. </parent>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. </dependencies>
  21. <!--打包插件, 使用它可以把项目打包为jar包-->
  22. <build>
  23. <plugins>
  24. <plugin>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-maven-plugin</artifactId>
  27. </plugin>
  28. </plugins>
  29. </build>
  30. </project>

User

  1. package com.limi.entity;
  2. public class User {
  3. private Integer id;
  4. private String userName;
  5. private String passWord;
  6. public User(){}
  7. public User(Integer id, String userName, String passWord) {
  8. this.id = id;
  9. this.userName = userName;
  10. this.passWord = passWord;
  11. }
  12. @Override
  13. public String toString() {
  14. return "User{" +
  15. "id=" + id +
  16. ", userName='" + userName + '\'' +
  17. ", passWord='" + passWord + '\'' +
  18. '}';
  19. }
  20. public Integer getId() {
  21. return id;
  22. }
  23. public void setId(Integer id) {
  24. this.id = id;
  25. }
  26. public String getUserName() {
  27. return userName;
  28. }
  29. public void setUserName(String userName) {
  30. this.userName = userName;
  31. }
  32. public String getPassWord() {
  33. return passWord;
  34. }
  35. public void setPassWord(String passWord) {
  36. this.passWord = passWord;
  37. }
  38. }

MyConfig

  1. package com.limi.config;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  4. import org.springframework.context.annotation.*;
  5. @Configuration
  6. public class MyConfig {
  7. @Bean
  8. public User user01(){
  9. return new User(1, "andy", "123456");
  10. }
  11. @Bean
  12. @ConditionalOnBean(name = "user01") //当user01存在时才注册user02
  13. public User user02(){
  14. return new User(2, "bob", "666666");
  15. }
  16. }

MainApplication

  1. package com.limi;
  2. import com.limi.entity.User;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.ConfigurableApplicationContext;
  6. @SpringBootApplication
  7. public class MainApplication {
  8. public static void main(String[] args) {
  9. //1、返回我们IOC容器
  10. ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
  11. if(run.containsBean("user01"))
  12. System.out.println((User)run.getBean("user01"));
  13. else
  14. System.out.println("user01 不存在!\n");
  15. if(run.containsBean("user02"))
  16. System.out.println((User)run.getBean("user02"));
  17. else
  18. System.out.println("user02 不存在!\n");
  19. }
  20. }

到此这篇关于SpringBoot深入探究@Conditional条件装配的使用的文章就介绍到这了,更多相关SpringBoot @Conditional内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号