Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设定器注射不使用工厂方法注射弹簧_Java_Spring_Dependency Injection_Constructor Injection - Fatal编程技术网

Java 设定器注射不使用工厂方法注射弹簧

Java 设定器注射不使用工厂方法注射弹簧,java,spring,dependency-injection,constructor-injection,Java,Spring,Dependency Injection,Constructor Injection,我有两个bean,SimpleBean和ArgumentBean,我正在尝试通过工厂方法连接bean,并尝试替换同一bean定义中的bean(我知道这样做很糟糕,但我只是在做一个实验) i、 e.我的工厂公用设施等级如下: public class FactoryClassUtils { public static ArgumentBean getArgumentBean(String firstArg, int secondArg) { return new

我有两个bean,SimpleBean和ArgumentBean,我正在尝试通过工厂方法连接bean,并尝试替换同一bean定义中的bean(我知道这样做很糟糕,但我只是在做一个实验)

i、 e.我的工厂公用设施等级如下:

    public class FactoryClassUtils {

    public static ArgumentBean getArgumentBean(String firstArg, int secondArg) {
        return new ArgumentBean(firstArg, secondArg);
    }

    public static SimpleBean getSimpleBean(ArgumentBean firstArg, int secondArg) {
        return new SimpleBean(firstArg, secondArg);
    }

    }
以下提到的配置已在spring配置xml中指定:

        <bean name="argumentBean" class="com.view.spring.factory.factoryclasses.FactoryClassUtils"
        factory-method="getArgumentBean">
        <constructor-arg type="java.lang.String" index="0" value="Hey All!!!" />
         <constructor-arg type="int" index="1" value="20" />
    </bean>

    <bean name="simpleBean"
        class="com.view.spring.factory.factoryclasses.FactoryClassUtils"factory-method="getSimpleBean">
        <constructor-arg>
        <bean class="com.tcs.view.spring.dataobjects.ArgumentBean"/>
        </constructor-arg>
        <constructor-arg type="int" value="20" />
        <property name="argumentBean" ref="argumentBean" /> 
    </bean> 
值得一提的是,所有getter和setter都存在于这两个bean中。SimpleBean.java具有ArgumentBean.java类型的属性

简单Bean的定义是:

 package com.view.spring.dataobjects;
 public class SimpleBean {
    private ArgumentBean argumentBean;
    int argumentCount;

    public ArgumentBean getArgument() {
        return argumentBean;
    }

    public void setArgument(ArgumentBean argumentBean) {
        this.argumentBean= argumentBean;
    }

    public int getArgumentCount() {
        return argumentCount;
    }

    public void setArgumentCount(int argumentCount) {
        this.argumentCount = argumentCount;
    }

    public SimpleBean(ArgumentBean argument, int argumentCount) {
        this.argumentBean= argument;
        this.argumentCount = argumentCount;
    }

    public void letHimSay() {
        argumentBean.saySomething();
        System.out.println(this.argumentCount);
    }
}
ArgumentBean的定义是:

package com.view.spring.dataobjects;

public class ArgumentBean {

    private String sayString;
    private int anotherArg;

    public ArgumentBean(String sayString, int anotherArg) {
        this.sayString = sayString;
        this.anotherArg = anotherArg;
    }
    public ArgumentBean(String sayString, Integer anotherArg) {
        this.sayString = sayString;
        this.anotherArg = anotherArg.intValue();
    }

    public ArgumentBean() {

    }

    public void saySomething() {
        System.out.println("We say: "+this.sayString);
        System.out.println(this.anotherArg+" times");
    }
}

如果从simpleBean定义中删除属性标记,则不会出现任何错误。此标记不适用于工厂方法,但在尝试使用构造函数参数时效果良好。有人能帮我理解这种情况吗?

您需要在FactoryClassUtils类中为argumentBean添加一个setter方法

   public class FactoryClassUtils {

    private ArgumentBean argumentBean = null;

    public static ArgumentBean getArgumentBean(String firstArg, int secondArg) {
        return new ArgumentBean(firstArg, secondArg);
    }

    public static SimpleBean getSimpleBean(ArgumentBean firstArg, int secondArg) {
        return new SimpleBean(firstArg, secondArg);
    }

    public void setArgumentBean(Argumentbean argumentBean){
    this.argumentBean = argumentBean;    
    }

}
这是必需的,因为您已经在xml中将argumentbean定义为FactoryClassUtils的属性

<bean name="simpleBean"
    class="com.view.spring.factory.factoryclasses.FactoryClassUtils"factory-method="getSimpleBean">
    <constructor-arg>
    <bean class="com.tcs.view.spring.dataobjects.ArgumentBean"/>
    </constructor-arg>
    <constructor-arg type="int" value="20" />
    <property name="argumentBean" ref="argumentBean" /> 


按照Java命名约定为属性放置setter和getter方法总是很好的

感谢大家花时间为我提供帮助。问题解决了。问题是我的代码。java中的bean名称是argument而不是argumentBean。我指的是变量名,但应该与getter name搭配,除了'get'后缀(当然是第一个字母smallcase)。我将配置更改为以下内容:
解决了问题。

请显示
SimpleBean
的定义。看起来您正在尝试同时使用构造函数和setter注入,但您没有在任何地方显示您实际拥有setter。错误询问
setter的参数类型是否与getter的返回类型匹配?
是这样吗?工厂方法是老派的。使用@Configuration类,您可以添加所需的所有java逻辑,而无需任何XML@chrylis我对我的问题进行了编辑,以提供SimpleBean和SimpleBean的定义ArgumentBean@Callahan恐怕不是这样,getter的返回类型与setter的参数类型匹配。
<bean name="simpleBean"
    class="com.view.spring.factory.factoryclasses.FactoryClassUtils"factory-method="getSimpleBean">
    <constructor-arg>
    <bean class="com.tcs.view.spring.dataobjects.ArgumentBean"/>
    </constructor-arg>
    <constructor-arg type="int" value="20" />
    <property name="argumentBean" ref="argumentBean" />