Извлекать Bean программно
@Configuration
public class MyConfig {
@Bean(name = "myObj")
public MyObj getMyObj() {
return new MyObj();
}
}
У меня есть этот объект MyConfig с аннотацией @Configuration Spring.
Мой вопрос в том, как я могу программно получить bean (в обычном классе)?
например, фрагмент кода выглядит следующим образом.
Спасибо заранее.
public class Foo {
public Foo(){
// get MyObj bean here
}
}
public class Var {
public void varMethod(){
Foo foo = new Foo();
}
}
Ответы
Ответ 1
Здесь пример
public class MyFancyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void businessMethod() {
//use applicationContext somehow
}
}
Однако вам редко приходится напрямую обращаться к ApplicationContext. Как правило, вы запускаете его один раз и позволяете beans автоматически загружаться.
Здесь вы идете:
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Обратите внимание, что вам не нужно упоминать файлы, уже включенные в applicationContext.xml. Теперь вы можете просто выбрать один bean по имени или типу:
ctx.getBean("someName")
Обратите внимание, что существует несколько способов запуска Spring - использование ContextLoaderListener, @Configuration и т.д.
Ответ 2
Попробуйте следующее:
public class Foo {
public Foo(ApplicationContext context){
context.getBean("myObj")
}
}
public class Var {
@Autowired
ApplicationContext context;
public void varMethod(){
Foo foo = new Foo(context);
}
}
Ответ 3
Самый простой (хотя и не самый чистый) подход, если вам действительно нужно извлечь beans из ApplicationContext
, - это реализовать ваш класс интерфейса ApplicationContextAware
и предоставить метод setApplicationContext()
.
Как только у вас есть ссылка на ApplicationContext
, у вас есть доступ ко многим методам, которые возвратят вам экземпляры bean.
Недостатком является то, что это делает ваш класс осведомленным о контексте Spring, который следует избегать, если это необходимо.