Весной, могу ли я автоматически отправлять новые бобы изнутри бобов с автоматическим подключением?

Я обычно просто @Autowire вещи в весенние объекты. Но я столкнулся с ситуацией, когда мне нужно динамически создавать некоторые объекты, которые требуют значений, которые могут быть автоматически подключены.

Что я должен делать? Что я мог сделать, так это просто вручную передать значения автопроводки в конструктор новых объектов. То, что я хотел бы сделать, это просто автоматически связать каждый новый объект при его создании.

@Service
public class Foo {
    @Autowired private Bar bar;

    /** This creates Blah objects and passes in the autowired value. */
    public void manuallyPassValues() {
        List<Blah> blahs = new LinkedList<Blah>();
        for(int i=0; i<5; ++i) {
            Blah blah = new Blah(bar);
            blahs.add(blah);
        }
        // ...
    }

    /** This creates Blah objects and autowires them. */
    public void useAutowire() {
        List<Blah> blahs = new LinkedList<Blah>();
        for(int i=0; i<5; ++i) {
            // How do I implement the createAutowiredObject method?
            Blah blah = createAutowiredObject(Blah.class);
            blahs.add(blah);
        }
        // ...
    }
}

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

1 ответ

Решение

Ты можешь использовать AutowireCapableBeanFactory:

@Service 
public class Foo { 
    @Autowired private AutowireCapableBeanFactory factory; 

    private <T> T createAutowiredObject(Class<T> c) {
        return factory.createBean(c);
    }
    ...
}
Другие вопросы по тегам