web-dev-qa-db-ja.com

Spring Bootでアプリケーションコンテキストを使用してBeanを取得する方法

SpringBootプロジェクトを開発していますが、applicationContextを使用してその名前でBeanを取得します。 Webから多くのソリューションを試しましたが、成功しませんでした。私の要件は、コントローラーがあることです

ControllerA

コントローラー内にはメソッドgetBean(String className)があります。登録済みBeanのインスタンスを取得したい。休止状態のエンティティがあり、getBeanメソッドでのみクラスの名前を渡すことにより、Beanのインスタンスを取得します。

誰かが解決策を知っているなら助けてください。

33
Qasim

フィールドとしてApplicationContextを自動配線できます。

@Autowired
private ApplicationContext context;

またはメソッド

@Autowired
public void context(ApplicationContext context) { this.context = context; }

最後に使用

context.getBean(SomeClass.class)
53
reos

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の参照でオブジェクトを取得できます。希望はうまく説明した。疑わしい場合はお知らせください。

7
Debendra Parida

Spring Bean(この場合は@Controller Bean)の内部にいる場合は、Springコンテキストインスタンスをまったく使用しないでください。 className Beanを直接自動配線するだけです。

ところで、それは悪い慣行と考えられているので、フィールド注入の使用を避けてください。

1
luboskrnac

アプリケーションコンテキストを提供できる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()
}
0
Sam