Что является лучшей практикой: используйте прототип bean вместо оператора new () - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь понять, как правильно использовать прототип bean-компонента Spring.Может быть, следующий пример кода поможет вам понять мою дилемму:

List<ClassA> caList = new ArrayList<ClassA>();
    for (String name : nameList) {
        ClassA ca = new ClassA();

    //or Shall I use protypebean, using method lookup I can inject the dependency of ClassA. 
    // ClassA ca = getPrototypeClassA();

        ca.setName(name);
        caList.add(ca);
    }

Таким образом, моя точная точка зрения в этом сценарии - использовать метод инъекции или оператор new ().Предоставьте свое мнение с обоснованием.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Кажется, что вашему экземпляру нужны некоторые значения времени выполнения для правильной инициализации. В таком случае это зависит от того, нужно ли вам использовать функцию пружины, такую ​​как AOP, для экземпляра ClassA. Если да, переходите к методу внедрения. Если нет, вы можете использовать фабричный шаблон. Намного больше ОО и чище для меня:

Что-то вроде следующего. Вы должны получить идею.

@Component
public class FactoryForClassA {

    @Autowired
    private FooBean someDependencyForClassA;


    public ClassA create(String name){
        ClassA a = new ClassA(someDependencyForClassA);
        a.setName(name);
        return a;
    }
}

И код клиента:

@Autowired
private FactoryForClassA factoryForClassA;

List<ClassA> caList = new ArrayList<ClassA>();
for (String name : nameList) {
    ClassA a = factoryForClassA.create(name);
    caList.add(ca);
}
0 голосов
/ 04 января 2019

Если ClassA нужно иметь @Autowired ссылки, то перейдите к бобу-прототипу.

В противном случае подойдет простой POJO (о котором контейнер Spring не знает).

0 голосов
/ 03 января 2019

Вы можете использовать любой из этих способов, потому что в конечном итоге клиентский код отвечает за обработку жизненного цикла прототипа компонента, а не контейнера Spring.

Согласно Spring-docs,

В некоторых отношениях вы можете думать о роли контейнеров Spring, когда говорить о бобе-прототипе в качестве замены для оператор Java 'new'. Все аспекты жизненного цикла после этой точки должны быть обработанным клиентом.

Spring не управляет полным жизненным циклом прототипа EJB: контейнер создает, настраивает, декорирует и иным образом собирает прототип объекта, передает его клиенту, а затем больше не имеет знание этого экземпляра прототипа. Это ответственность клиентский код для очистки прототипа объектов в области и выпуска любого дорогие ресурсы, на которых держат прототип (ы).

...