我在Spring 3.2.2项目中有以下bean类:
@Service
public class PropertyFacade {
// This DOES NOT work
@Autowired
private String propertyFileName;
// This DOES work
// @Autowired
// public void setPropertyFileName( String propertyFileName ) {
// this.propertyFileName = propertyFileName;
// }
我的spring配置文件包含以下内容:
<context:component-scan base-package="org.sperbolink.utility" />
<context:component-scan base-package="org.sperbolink.facade" />
<bean id="propertyFacade" class="org.sperbolink.facade.PropertyFacade" >
<property name="propertyFileName" value="test-properties.inf" />
</bean>
我的调用方法如下:
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext( "spring-config-test.xml" );
BeanFactory factory = classPathXmlApplicationContext;
PropertyFacade propertyFacade = ( PropertyFacade ) factory.getBean( "propertyFacade" );
出于某种原因,当我尝试自动装配该属性时,我收到一个错误:
springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String org.sperbolink.facade.PropertyFacade.propertyFileName; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
但是,当我自动装配setter时,一切正常。为什么房产自动装配不起作用?
答案 0 :(得分:5)
异常消息告诉您完全问题是什么:
您没有在任何位置定义propertyFileName
bean。
您只需在 bean propertyFileName
中定义属性 propertyFacade
。如果您没有制定者,这将无效。
通过您的设置,propertyFileName
值test-properties.inf
将自动注入propertyFacade
课程中的相应字段。此处不需要@Autowire
注释。
@Autowire
注入特定字段时,可以使用带有字段的 <bean>
。这不应与使用<property>
混合使用。
在Spring docs中阅读更多内容。
答案 1 :(得分:0)
您无法自动装配字符串和原始值。 Spring不支持这一点。这就是基于现场的自动装配不起作用的原因
当您取消注释基于属性的自动装配时,您会立即使用XML配置覆盖它,您可以在其中注入特定值 - 这就是它以这种方式工作的原因。