Я обычно просто @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);
}
// ...
}
}
Идеально у меня не было бы конфигурационной информации в этом бобе. Это автосоединено проводом, таким образом, любые объекты, это должно сделать автопроводное соединение новых бобов, должны быть доступны ему путем автопроводного соединения их в.
Вы можете использовать AutowireCapableBeanFactory
:
@Service
public class Foo {
@Autowired private AutowireCapableBeanFactory factory;
private <T> T createAutowiredObject(Class<T> c) {
return factory.createBean(c);
}
...
}