Конструктор, который принимает аргументы - Определить как обычный объект или боб?

Допустим, у меня есть класс с конструктором, который принимает один или несколько аргументов. Предположим также, что аргументы, как ожидается, будут являться своего рода вводом от пользователя. Т.е. аргумент не может быть известен во время компиляции или во время конфигурации, только во время выполнения. Должен ли я определить свой класс как прототип весеннего компонента или просто создать его с помощью "нового".

Если я должен определить его как боб, как я могу передать аргументы?

Ответы на вопрос(3)

в вашем контексте, то нет, вы не должны делать это bean-компонентом - это бессмысленно. Просто используйтеnew.

Единственная веская причина сделать его бобовым - если он Делает зависит от других bean-компонентов, и в этом случае оправдано использование bean-объекта с прототипом. Однако, если класс требует эти значения времени выполнения в своем конструкторе, вы не сможете этого сделать, если не будете изменять класс, чтобы вводить их через какой-то метод вместо использования конструктора.

 skaffman15 мая 2012 г., 21:37
@ LudwigMagnusson: Затем я предлагаю рефакторинг класса, чтобы ваши значения времени выполнения передавались в метод, который затем возвращает соответствующий компонент, а не передавали их в конструктор.
 Ludwig Magnusson15 мая 2012 г., 21:49
Я попробую это и посмотрим, получится ли это хорошо. Благодарность
 Ludwig Magnusson15 мая 2012 г., 21:43
Это невозможно. Класс реализует интерфейс, который определяет метод, и он не может принимать аргументы, поскольку предполагается, что реализующие классы могут создавать компоненты из различных типов ввода. Но, может быть, если я подумаю об этом более глубоко, я смогу провести такой рефакторинг ...
 Ludwig Magnusson15 мая 2012 г., 21:33
Ну ... объект, который я хочу создать, должен возвращать Spring Beans одним из его методов, поэтому он Делает зависит от них. Но если это не может быть сделано, то это не может быть сделано ...
 skaffman15 мая 2012 г., 21:46
@ LudwigMagnusson: В этом случае оберните класс в другой класс, которым вы можете управлять, и сделайте этот новый класс bean-объектом с прототипом с сигнатурой, которую вы хотите иметь.
Решение Вопроса

их компонентов, просто создайте его с помощьюnew. Если у вас есть класс, зависящий от других bean-компонентов Spring, но вы все же хотите передать некоторые аргументы времени выполнения, в настоящее время Spring его не поддерживае

Как бы то ни было, посмотри на SPR-7431 а также моя статья о передаче пользовательского аргумента<lookup-methods/>. Если все идет хорошо, эта функция должна быть частью Spring 3.2, и она должна соответствовать вашим требованиям. Это в основном позволяет создаватьprototype -объекты бобов, в то же время передавая аргумент конструктора.

 ,Ludwig Magnusson15 мая 2012 г., 21:43
Очень хорошая и приятная информация. Благодарност
 javadeveloper26 сент. 2013 г., 20:17
Обновление: эта функция еще не является частью весны.
 sunny_dev27 окт. 2015 г., 12:28
Это поддерживается в Spring 4 сейчас?

up-метода не работает весной 3.2.11, но работает в весенней версии 4.1.1

Вот код, который я использовал для проверки:

это фабрика интерфейсов ...

package prueba;

public interface Factory {

    Person createPersonWithDependencies(String name);
}

это боб, которым мы хотим управлять весной, вводя 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();
    }

}

и, наконец, весенний конфигурационный файл:

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

Ваш ответ на вопрос