Подтвердить что ты не робот

Извлекать 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();
    }
}
4b9b3361

Ответ 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, который следует избегать, если это необходимо.