Spring注入不适用于构造函数arg

时间:2012-04-27 13:05:37

标签: java spring

我有以下java类:

package configuration;
import common.config.ConfigurationService;

public class AppConfig {

    private ConfigurationService configurationService;  

    public AppConfig(ConfigurationService configurationService){
        this.configurationService = configurationService;
    }

public class ConfigurationServiceImpl
  implements ConfigurationService, Runnable
{...

,应用程序上下文文件如下:

<bean id="appConfig" class="configuration.AppConfig" scope="prototype">
        <constructor-arg ref="configurationService"></constructor-arg>
    </bean>

    <bean id="configurationService"  class="common.config.ConfigurationServiceImpl" scope="singleton" />
    <bean id="propertyPlaceholderConfigurer"    class="common.config.PropertyPlaceholderConfigurer">
        <constructor-arg ref="configurationService" />
        <constructor-arg ref="serviceName" />
    </bean>

     <bean id="serviceName" class="java.lang.String"><constructor-arg value="filter"/></bean>  

在初始化期间我收到以下错误,我的bean没有初始化:

  

引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[conf / applicationContext.xml]中定义名称为'appConfig'的bean时出错:指定了1个构造函数参数但在bean'appConfig中找不到匹配的构造函数'(提示:为简单参数指定索引和/或类型参数以避免类型歧义)

如果我按如下方式修改java类代码,则Spring注入有效:

package configuration;
import common.config.ConfigurationServiceImpl;

    public class AppConfig {

        private ConfigurationServiceImpl configurationService;  

        public AppConfig(ConfigurationServiceImpl configurationService){
            this.configurationService = configurationService;
        }

2 个答案:

答案 0 :(得分:2)

首先,您必须知道Spring do not support interface injection,,这就是为什么第一种情况下的代码不起作用,因为您传递的是ConfigurationService,它是一个接口作为构造函数args。

在第二种情况下,您通过传递ConfigurationService的实现类并将其作为构造函数参数来正确执行。

答案 1 :(得分:1)

只是看一下,Spring配置中AppConfig的包名称与Java源代码中声明的包不匹配。你有“common.config”与“配置”。可能是错误文本具有误导性,未找到构造函数的原因是找不到类本身。