条件类的子类中的春季注入豆



我有一个这样的组件

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

我无法在条件示例类中自动连接任何 Spring bean。它保持为空。我尝试在条件示例之上@Component,但它不起作用。我需要在 match 方法中使用我的存储库类查询 db,并决定是否创建 bean。我该如何做到这一点?

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

您可以在条件类中自动连接应用程序上下文类,并在匹配方法中放置调试点,并查看应用程序上下文 Bean 定义映射。您没有加载很多类(几乎很少(。

一种可能的解决方案是,您可以使用自动连线的存储库类编写 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(...)
}
}

不能将bean 注入到Condition类中:

这是突出显示的文档。

条件必须遵循与 BeanFactoryPostProcessor 相同的限制,并注意永远不要与 Bean 实例交互。要更精细地控制与@Configuration bean 交互的条件,请考虑 ConfigurationCondition 接口。

为了解决您的问题,我认为您必须更改存储条件的位置或使用纯java代码创建与数据库的连接并检查条件

最新更新