2

我在 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;
//    }

我的弹簧配置文件有以下内容:

<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.

但是,当我自动装配设置器时,一切正常。为什么属性自动装配不起作用?

4

2 回答 2

5

异常消息会告诉您确切的问题是什么:

您没有在propertyFileName任何地方定义 bean。您只需在bean中定义属性 。如果您没有二传手,这将不起作用。propertyFileName propertyFacade

通过您的设置,propertyFileNametest-properties.inf自动注入到类中的相应字段中propertyFacade。这里不需要@Autowire注释。

@Autowire<bean>当您想将(在某处定义的)注入特定字段时,可以使用 with 字段。这不应该与 using 混合使用<property>

在Spring 文档中阅读更多内容。

于 2013-11-13T20:28:23.527 回答
0

您不能自动装配字符串和原始值。Spring 不支持这一点。这就是为什么基于字段的自动装配不起作用

当您取消注释基于属性的自动装配时,您会立即使用注入特定值的 XML 配置覆盖它——这就是它以这种方式工作的原因。

于 2017-03-16T21:19:25.300 回答