2014-11-13 5 views
0

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

Я хочу знать, возможно ли это, и как мне настроить мое приложение. Я использую Spring 3 и xml конфигурацию.

Вот пример:

class MyClass { 
    private MyClass2 obj2; // should be injected by spring 
    private Long myId; 

    public MyClass(Long dynamicId) { 
     myId = dynamicId; 
    } 

    public void doSomehting() { 
     obj2.doOtherStuff(this); 
    } 
} 

Итак, что я хочу, так как я должен создать MyClass динамически, является то, что после того, как я называю новый MyClass (1234), то obj2 получает впрыскивается весной.

Возможно ли это?

ответ

1

использовать ObjectFactory для извлечения компонента из контейнера-контейнера. Если вы закроете эту фабрику собственными фабричными объектами, вы можете установить любое свойство и по-прежнему управлять компонентом Spring. Так как вы хотите, чтобы bean имел некоторое динамически настроенное свойство, подумайте об этом, нужен ли вам компонент с одним цветом (по умолчанию) или прототип.

Если вы намереваетесь сделать это из xml config, вам нужно обмануть objectfactorycreatingfactorybean. Весенняя документация отличная, просто следуйте примеру.

Если вы используете конфигурацию на основе аннотаций, вам просто нужно автоустановить ObjectFactory. Обратите внимание, что YourClass также должен быть объявлен как bean-компонент!

0

Если вы создаете экземпляр MyClass динамически с помощью нового оператора, этот экземпляр находится за пределами фабрики компонентов Spring, поэтому Spring не может ничего вводить. У вас действительно есть два варианта, из того, что я вижу. 1) Сделайте MyClass прототипом bean, поэтому Spring дает вам новый экземпляр каждый раз, когда вам это нужно. Вам нужно будет определить obj2 как свойство, которое нужно установить (или Autwired). 2) Инъекция obj2 через Spring в класс, который создает экземпляр MyClass и делает obj2 аргументом конструктора, поэтому вам нужно его вводить.

Мой 0,02 из того, что я прочитал из вашего вопроса. Следует отметить, что при создании нового экземпляра на Java он всегда находится за пределами фабрики компонентов, и вся работа, выполняемая за пределами фабрики компонентов, теряет поведение прокси-сервера Spring. Будьте очень осторожны, вы можете попасть в кроличью нору, которую трудно отследить.

1

Я уверен, что это невозможно. Похоже, вы хотите (scary music) завод.

class MyClassFactory { 

    private final MyClass2 object; 

    public(MyClass2 object) { 
    this.object = object; 
    } 

    public createMyClass(Lond id) { 
    return new MyClass(id, object); 
    } 
} 
Смежные вопросы