java - Spring在条件类的子类中注入(inject)bean

标签 java spring spring-boot dependency-injection spring-data

我有一个这样的组件

@Component
@Conditional(ConditionExample.class)
public class ScheduledExample implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {

        System.out.println();

    }
}

我也有这样的条件类:

 public class ConditionExample implements Condition {

        private ParameterRepository parameterRepository; // it is a spring data repository

        @Autowired
        public void setParameterRepository(ParameterRepository parameterRepository) {
            this.parameterRepository= parameterRepository;
        }

        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            //query db with parameterRepository and decide
            return false;
        }
    }

我无法在 ConditionExample 类中 Autowiring 任何 Spring bean。它仍然为空。我在 ConditionExample 之上尝试了 @Component 但它不起作用。 我需要在 matches 方法中使用我的存储库类查询数据库,并决定是否创建 bean。我该如何实现这一目标?

最佳答案

我认为这是不可能的。因为 @Conditional 注释是在组件扫描的早期处理的,在此期间您的存储库或任何其他类都不会加载。

您可以在 Condition 类中 Autowiring ApplicationContext 类,并将调试点放入您的 matches 方法中,然后查看应用程序上下文 bean 定义映射。您没有加载很多类(几乎很少)。

一种可能的解决方案是,您可以编写一个 Autowiring 存储库类的 bean。在 @PostContruct 方法中,您可以执行数据库查询,并根据结果您可以将其他 bean(您想要有条件加载)注册到应用程序上下文。

类似这样的

@Component
public class SomeBean {

    private ParameterRepository parameterRepository; // it is a spring data repository

    private GenericWebApplicationContext context;

    @Autowired
    public void setParameterRepository(ParameterRepository parameterRepository, GenericWebApplicationContext context) {
        this.parameterRepository= parameterRepository;
        this.context = context
    }

    @PostConstruct
    public void someMethod() {
        //query db with parameterRepository and decide
        //context.registerBeanDefinition(...)
    }
}

关于java - Spring在条件类的子类中注入(inject)bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50758398/

相关文章:

java - css 文件不适用于 springboot 元素

java - 使用一个 java 命令执行两个单独的类

mysql - jparepository 接口(interface)上的自定义方法

java - JSP - 添加一个不在 modelAttribute 上的表单参数

java - 具有连接、逻辑和性能询问的 ORM(使用 JPA 和 Spring)

java - Spring Cloud DataFlow - 如何在 TCP 源中使用自定义 TCP 编码器/解码器

java - 使用 Spring 缓存处理 Java 8 Optional

java - 如何在 Spring Security 中更改登录 URL

java - 创建 n 个保存对象的数组的最佳方法

java - 无法转换 java.util.Arraylist 类型的对象 从 Firebase 实时数据库嵌套对象读取