在 Spring 4 中扫描 @Configuration bean

Scanning @Configuration beans in Spring 4

我正在将我的网络应用程序从 Spring 3.1 升级到 4.1.8,但遇到了问题。我的代码没有改变(只有我的 pom.xml)

我的主要上下文中有一个配置 bean,如下所示:

@Configuration
public class StorableServiceConfiguration {
    ...
    @Bean 
    public StorableService<Template, Long> templateService(ITemplateJpaDao dao) {
        return new DaoService<Template, Long>(Template.class, dao);
    }
}

显然在我的网络应用程序的其他地方,我有这样的声明:

@Autowired
@Qualifier("templateService")
private StorableService<Template, String> templateService;

现在这一切在 Spring 3.1.1 上运行良好,但在将版本更新到 4.1.8 后,我收到此错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [w.wexpense.service.StorableService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=templateService)}

有人知道吗?

我在某处读到 Spring 4 中关于 context:component-扫描关于 @Configuration 注释的行为方式的更改,但不记得是什么。有人知道吗?

谢谢

Spring 4 autowire bean 使用 Java 泛型作为 @Qualifier.

的形式

所以你有一个 Bean @AutowiredStorableService<Template, String> 但是在你的 @Configuration class 你的 @Bean 声明 StorableService<Template, Long>.

如果您想要一个 StorableService<Template, String> 实例,您应该在 @Configuration class 处创建另一个 @Bean,例如:

@Bean 
public StorableService<Template, String> templateService(ITemplateJpaDao dao) {
    return new DaoService<Template, String>(Template.class, dao);
}

自动装配 它没有 @Qualifier 注释:

@Autowired
private StorableService<Template, String> templateService;

Spring 4 将完美注入。查看此博客 post 了解 Spring 4.

的这一新功能