我有一个这样的组件
@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/