SpringBootプロジェクトを開発していますが、applicationContext
を使用してその名前でBeanを取得します。 Webから多くのソリューションを試しましたが、成功しませんでした。私の要件は、コントローラーがあることです
ControllerA
コントローラー内にはメソッドgetBean(String className)
があります。登録済みBeanのインスタンスを取得したい。休止状態のエンティティがあり、getBean
メソッドでのみクラスの名前を渡すことにより、Beanのインスタンスを取得します。
誰かが解決策を知っているなら助けてください。
フィールドとしてApplicationContextを自動配線できます。
@Autowired
private ApplicationContext context;
またはメソッド
@Autowired
public void context(ApplicationContext context) { this.context = context; }
最後に使用
context.getBean(SomeClass.class)
ApplicationContextAwareを使用できます。
ApplicationContextAware:
実行されるApplicationContextの通知を希望するオブジェクトによって実装されるインターフェイス。このインターフェイスの実装は、たとえば、オブジェクトがコラボレーションBeanのセットへのアクセスを必要とする場合に意味があります。
アプリケーションコンテキストへの参照を取得するには、いくつかの方法があります。次の例のようにApplicationContextAwareを実装できます。
package hello;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public ApplicationContext getContext() {
return applicationContext;
}
}
更新:
SpringがBeanをインスタンス化するの場合、ApplicationContextAware実装を探します。実装が見つかった場合、setApplicationContext()メソッドが呼び出されます。
このようにして、Springはcurrent applicationcontextを設定しています。
Springのsource code
のコードスニペット:
private void invokeAwareInterfaces(Object bean) {
.....
.....
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
}
}
アプリケーションコンテキストへの参照を取得したら、getBean()を使用して必要なBeanを取得します。
実際には、Springアプリケーションの開始時に必要なクラスのオブジェクトを保持しているSpringエンジンからオブジェクトを取得する必要があります(Springエンジンの初期化)。参照。
サービスクラス内
@Autowired
private ApplicationContext context;
SomeClass sc = (SomeClass)context.getBean(SomeClass.class);
これで、scの参照でオブジェクトを取得できます。希望はうまく説明した。疑わしい場合はお知らせください。
Spring Bean(この場合は@Controller
Bean)の内部にいる場合は、Springコンテキストインスタンスをまったく使用しないでください。 className
Beanを直接自動配線するだけです。
ところで、それは悪い慣行と考えられているので、フィールド注入の使用を避けてください。
アプリケーションコンテキストを提供できるApplicationContextAwareクラスを使用できます。
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx = null;
public static ApplicationContext getApplicationContext() {
return ctx;
}
@Override
public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
ApplicationContextProvider.ctx = ctx;
}
/**
* Tries to autowire the specified instance of the class if one of the specified
* beans which need to be autowired are null.
*
* @param classToAutowire the instance of the class which holds @Autowire
* annotations
* @param beansToAutowireInClass the beans which have the @Autowire annotation
* in the specified {#classToAutowire}
*/
public static void autowire(Object classToAutowire, Object... beansToAutowireInClass) {
for (Object bean : beansToAutowireInClass) {
if (bean == null) {
ctx.getAutowireCapableBeanFactory().autowireBean(classToAutowire);
}
}
}
}
使用するだけ:
org.springframework.beans.factory.BeanFactory#getBean(Java.lang.Class)
例:
@Component
public class Example {
@Autowired
private ApplicationContext context;
public MyService getMyServiceBean() {
return context.getBean(MyService.class);
}
// your code uses getMyServiceBean()
}