gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:06:16 29 4
gpt4 key购买 nike

我有一个这样的组件

@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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com