接受参数的构造函数 - 定义为普通对象或spring bean?

时间:2012-05-15 19:24:41

标签: spring

假设我有一个带有一个带有一个或多个参数的构造函数的类。我们还要说这些参数应该是来自用户的一些输入。即,只有在运行时才能在编译时或配置时知道参数。我应该将我的类定义为原型spring bean,还是应该用“new”创建它。

如果我将它定义为bean,我该如何传入参数?

3 个答案:

答案 0 :(得分:7)

这在Spring中存在问题。如果您的类没有依赖其他bean,只需使用new创建它。如果你有一个类依赖于其他Spring bean但你想要传递一些运行时参数,那么Spring目前不支持它。

但请查看SPR-7431my article about passing custom argument to <lookup-methods/>。如果一切顺利,此功能应该是Spring 3.2的一部分,它应该符合您的要求。它基本上允许创建prototype - 作用域bean,同时仍传递一些构造函数参数。

答案 1 :(得分:5)

除非你的类在你的上下文中也依赖于其他bean,否则你不应该把它变成bean - 没有意义。只需使用new

使它成为bean的唯一令人信服的理由是,如果它 依赖于其他bean,在这种情况下,原型范围的bean是合理的。但是,如果类在其构造函数中需要这些运行时值,那么您不能真正这样做,不能通过某种方法而不是使用构造函数来更改类以注入它们。

答案 2 :(得分:0)

使用lookup-method传递参数到构造函数的spring-feature在spring 3.2.11中不起作用,但是在Spring 4.1.1版本中工作

这是我用来检查它的代码:

这是界面工厂......

package prueba;

public interface Factory {

    Person createPersonWithDependencies(String name);
}

这是我们希望由spring管理的bean,注入helloWorldService ...

package prueba;

public class Person {

    private HelloWorldService helloWorldService;

    public final void setHelloWorldService(HelloWorldService extraService) {
        this.helloWorldService = extraService;
    }

    public Person() {
        super();
    }

    public Person(String name) {
        super();
        this.name = name;
    }

    private String name;

    public final String sayHello() {
        return helloWorldService.getGreeting()+" I am "+name;
    }   
}

这是着名的helloworld服务:

package prueba;

public class HelloWorldService {

    public String getGreeting(){
        return "hello world";
    }
}

这是一个使用Factory

的示例服务
package prueba;

public class Service {

    private Factory factory;

    public final void setFactory(Factory factory) {
        this.factory = factory;
    }


    public void doSomeThing(){
        Person bean1= factory.createPersonWithDependencies("Jhon");

        System.out.println(bean1.sayHello());

        Person bean2= factory.createPersonWithDependencies("Maria");

        System.out.println(bean2.sayHello());
        System.out.println(bean1.sayHello());

    }
}

这是测试所有

的主要类
package prueba;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestLookupMethodWithArguments {
     /**
     * Main method.
     */
    public static void main(String[] args) {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");

        Service service=applicationContext.getBean("service",Service.class);

        service.doSomeThing();
    }

}

最后是spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloWorldService" class="prueba.HelloWorldService" />

    <bean id="Person" class="prueba.Person" scope="prototype">
        <property name="helloWorldService" ref="helloWorldService" />
    </bean>

    <bean id="myFactory" class="prueba.Factory">
        <lookup-method name="createPersonWithDependencies" bean="Person" />
    </bean>

    <bean id="service" class="prueba.Service">
        <property name="factory" ref="myFactory" />
    </bean>
</beans>

使用弹簧4.1.1输出

hello world I am Jhon
hello world I am Maria
hello world I am Jhon