2012-05-15 3 views
7

Предположим, что у меня есть класс с конструктором, который принимает один или несколько аргументов. Предположим также, что аргументы, как ожидается, будут представлять собой некоторый вклад от пользователя. I. Аргумент не может быть известен во время компиляции или времени конфигурации только во время выполнения. Должен ли я определить свой класс в качестве прототипа весеннего боба или просто создать его с помощью «нового».Конструктор, который принимает аргументы. Определяет как обычный объект или весенний боб?

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

ответ

7

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

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

+0

Очень хорошая и приятная информация. Спасибо –

+0

Обновление: эта функция еще не является частью весны. – javadeveloper

+0

теперь поддерживается весной 4? –

5

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

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

+0

Ну .. предмет я хочу, чтобы создать действительно должен вернуть пружинную Фасоль в одном из своих методов так _does_ зависит от них. Но если это невозможно сделать, то это не может быть сделано ... –

+0

@LudwigMagnusson: Я предлагаю рефакторинг класса, чтобы ваши значения времени выполнения передавались в метод, который затем возвращает соответствующий компонент, а не передает их в конструктор. – skaffman

+0

Это невозможно. Класс реализует интерфейс, который определяет метод, и он не может принимать аргументы, поскольку предполагается, что классы-реализации могут создавать компоненты из разных типов ввода. Но, возможно, если я подумаю об этом глубже, я смогу реорганизовать его таким образом ... –

0

весенней особенность передают аргументы конструктору, используя поиск-метод не работает весна 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"; 
    } 
} 

это пример сервис, который использует завод

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 
Смежные вопросы