【发布时间】:2015-09-02 23:34:09
【问题描述】:
好的,所以,我有一个创建两个 bean 的配置类。它们的定义如下:
public class FileUploadConfiguration {
public static final String UPLOAD_PREFIX = "file.upload";
@Bean(name = "fileService", autowire = Autowire.BY_TYPE)
@DependsOn("fileUploadPaths")
@Autowired
public CRUDFileService fileService(@Qualifier("fileUploadPaths") PrefixedPropertyFactoryBean fileUploadPaths) throws Exception {
Map<String, String> paths = Maps.fromProperties(fileUploadPaths.getObject());
return new CRUDFileService(File.class.getName(), paths);
}
@Bean(name = "fileUploadPaths")
public PrefixedPropertyFactoryBean fileUploadPaths(Environment environment) {
PrefixedPropertyFactoryBean fileUploadPaths = new PrefixedPropertyFactoryBean();
fileUploadPaths.setPrefix(UPLOAD_PREFIX);
fileUploadPaths.setLocations(ResourceUtils.getActiveResources(environment));
return fileUploadPaths;
}
}
如果我在两个实例中都设置断点,流程如下:
1) fileUploadPaths 已实例化,对我来说它看起来是正确的。
2) fileService 被实例化,但是通过 FileUploadConfiguration bean 创建的 postProcessPropertyValues ......这对我来说似乎很奇怪。
3) 之后,我得到一个异常,因为似乎 Spring 尝试再次创建 fileService,但现在通过 createBean,并且由于某种原因 @Qualifier关于参数定义似乎被忽略了。
线程“main”中的异常 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建类中定义的名称为“fileService”的 bean 时出错 x.y.z.FileUploadConfiguration:表示不满足的依赖关系 通过类型索引为 0 的构造函数参数 [a.b.c.PrefixedPropertyFactoryBean]:不明确的工厂方法参数 类型 - 您是否将正确的 bean 引用指定为工厂方法 论据?在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:735) 在 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
注意:如果我将 fileService 定义更改为以下内容,则会解决此问题:
@Bean(name = "fileService")
@DependsOn("fileUploadPaths")
@Autowired
public CRUDFileService fileService(@Qualifier("fileUploadPaths") PrefixedPropertyFactoryBean fileUploadPaths, AutowireCapableBeanFactory factory) throws Exception {
Map<String, String> paths = Maps.fromProperties(fileUploadPaths.getObject());
CRUDFileService crudFileService = new CRUDFileService(File.class.getName(), paths);
factory.autowireBean(crudFileService);
return crudFileService;
}
所以,我没有让 Spring 通过 @Bean(autowire = Autowire.BY_TYPE) 自动装配我的 bean,而是简单地自动装配 AutowireCapableBeanFactory 并自动装配 CRUDFileService 自己做豆子。
我的问题是:为什么会发生这种行为?我使用 @Bean(autowire = Autowire.BY_TYPE) 正确吗?我以前就这样用过它,它的作用就像一个魅力,只是我没有像我用这个那样自动装配 bean 方法参数。
【问题讨论】:
-
只是为了澄清一下 -
PrefixedPropertyFactoryBean是 Spring Factory bean 吗? -
@BijuKunjummen 是的 - 它扩展了 AbstractFactoryBean
.
标签: java spring dependency-injection autowired