Spring Boot で Bean を取得するにはどのような方法がありますか?

WBOY
リリース: 2023-05-12 15:22:06
転載
1962 人が閲覧しました

Spring フレームワークを使用する場合、クラスが @Service や @Autowire を使用する場合、この依存関係注入メソッドが別のクラスの他のオブジェクトを参照することは誰もが知っていることですが、このクラスは Spring の IOC 重みを通じてのみ取得できます。たとえば、依存オブジェクトは正しく初期化できますが、それ以外の場合、依存オブジェクトは null になります。

そこで、通常のクラスで Spring IOC コンテナ (Spring 管理 Bean) 内の Bean を取得する方法について質問があります。

Spring の ApplicationContext コンテキスト オブジェクトが Bean を取得するための基礎であることは誰もが知っています。

Spring Boot では以下の 3 つの方法で Bean を取得できます。

メソッド 1 アノテーション @PostConstruct

Spring Boot で Bean を取得するにはどのような方法がありますか?

PostConstruct アノテーションは、初期化を実行するために依存関係の注入が完了した後に実行する必要があるメソッドで使用されます。このメソッドは、クラスをサービスに配置する前に呼び出す必要があります。

依存関係の注入をサポートするすべてのクラスは、このアノテーションをサポートする必要があります。 PostConstruct のアノテーションが付けられたメソッドは、クラスがリソースの注入を要求していない場合でも呼び出す必要があります。このアノテーションを付けられるメソッドは 1 つだけです。

PostConstruct アノテーションを適用するメソッドは、次のすべての標準に準拠する必要があります。

メソッドには、EJB インターセプタ (インターセプタ) の場合を除き、パラメータを含めることはできません。 EJB 仕様。この場合、InvocationContext オブジェクトが含まれます;
このメソッドの戻り値の型は void である必要があります;
このメソッドはチェック例外をスローしてはなりません;
PostConstruct を適用するメソッドは public または protected にすることができます, package private または private;
アプリケーション クライアントを除き、メソッドを static にすることはできません;
メソッドは Final にすることができます;
メソッドがチェックされていない例外をスローする場合、クラスをサービスに入れてはなりません 、例外を処理し、例外から回復できる EJB でない限り。

方法2 起動クラス ApplicationContext

実装方法: springboot 起動クラスに静的変数 ApplicationContext を定義し、コンテナの getBean メソッドを使用して依存オブジェクトを取得します。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
 * @author: clx
 * @version: 1.1.0
 */
@SpringBootApplication
public class Application {
    public static ConfigurableApplicationContext ac;
    public static void main(String[] args) {
       ac = SpringApplication.run(Application.class, args);
    }
 
}
ログイン後にコピー

メソッドの呼び出し

/**
 * @author: clx
 * @version: 1.1.0
 */
@RestController
public class TestController {
    /**
     * 方式二
     */
    @GetMapping("test2")
    public void method_2() {
        AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);
        String test2 = methodDemoService.test2();
        System.out.println(test2);
    }
}
ログイン後にコピー

方法 3 ApplicationContext の手動挿入

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
 
 
/**
 * springboot静态方法获取 bean 的三种方式(三)
 * @author: clx
 * @version: 1.1.0
 */
@Component
public class StaticMethodGetBean_3<T> implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        StaticMethodGetBean_3.applicationContext = applicationContext;
    }
 
    public static <T> T  getBean(Class<T> clazz) {
        return applicationContext != null?applicationContext.getBean(clazz):null;
    }
}
ログイン後にコピー

メソッドの呼び出し

/**
 * 方式三
 */
@Test
public void method_3() {
    AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);
    String test3 = autoMethodDemoService.test3();
    System.out.println(test3);
}
ログイン後にコピー

以上がSpring Boot で Bean を取得するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート