从Spring 4升级到Spring 5,并运行到@Autowired强制问题.有什么变通办法吗



我正在将我们的应用程序从spring4升级到spring5。该应用程序有一个我们无法接触的第三方依赖库。这个库使用spring4,它的一个bean正在自动连接一个空bean实例。这在春季4中运行良好,但在春季5中出现了以下异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'LibraryService': Unsatisfied dependency expressed through field '_beanDoesntExist'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'x.y.z.LibraryService$BeanDoesntExist' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

以下是库中@Autowired使用的演示,它将在春季5中触发上述异常(但在春季4中运行良好(:

@Service
public class LibraryService
{
@Autowired
private BeanDoesntExist _beanDoesntExist;
static class BeanDoesntExist {
}
@Configuration
static class Config {
@Bean
public BeanDoesntExist beanDoesntExist() {
return null;
}
}
}

似乎在春季5,增加了一个检查:https://github.com/spring-projects/spring-framework/blob/master/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java#L1293-L1296

if (result instanceof NullBean) {
if (isRequired(descriptor)) {
raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
}

如果required=true是默认值,则此检查将强制@Autowired始终返回not null实例。

相比之下,在spring 4中,没有这样的强制检查,在我的情况下,下面的代码只会返回null:https://github.com/spring-projects/spring-framework/blob/4.3.x/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java#L1131-L1132

return (instanceCandidate instanceof Class ?
descriptor.resolveCandidate(autowiredBeanName, type, this) : instanceCandidate);

既然我不能接触库代码,我想知道如何绕过春季5的@Autowired强制执行?我的应用程序无法在强制执行到位的情况下启动。

这是Spring 5中的一个突破性变化,已在此处介绍:

Spring 5处理空Bean的方式发生了变化?

使用Optional或ObjectProvider似乎是一种可行的解决方法。

最新更新