Spring フレームワークを使用する場合、クラスが @Service や @Autowire を使用する場合、この依存関係注入メソッドが別のクラスの他のオブジェクトを参照することは誰もが知っていることですが、このクラスは Spring の IOC 重みを通じてのみ取得できます。たとえば、依存オブジェクトは正しく初期化できますが、それ以外の場合、依存オブジェクトは null になります。
そこで、通常のクラスで Spring IOC コンテナ (Spring 管理 Bean) 内の Bean を取得する方法について質問があります。
Spring の ApplicationContext コンテキスト オブジェクトが Bean を取得するための基礎であることは誰もが知っています。
Spring Boot では以下の 3 つの方法で Bean を取得できます。
PostConstruct アノテーションは、初期化を実行するために依存関係の注入が完了した後に実行する必要があるメソッドで使用されます。このメソッドは、クラスをサービスに配置する前に呼び出す必要があります。
依存関係の注入をサポートするすべてのクラスは、このアノテーションをサポートする必要があります。 PostConstruct のアノテーションが付けられたメソッドは、クラスがリソースの注入を要求していない場合でも呼び出す必要があります。このアノテーションを付けられるメソッドは 1 つだけです。
PostConstruct アノテーションを適用するメソッドは、次のすべての標準に準拠する必要があります。
メソッドには、EJB インターセプタ (インターセプタ) の場合を除き、パラメータを含めることはできません。 EJB 仕様。この場合、InvocationContext オブジェクトが含まれます;
このメソッドの戻り値の型は void である必要があります;
このメソッドはチェック例外をスローしてはなりません;
PostConstruct を適用するメソッドは public または protected にすることができます, package private または private;
アプリケーション クライアントを除き、メソッドを static にすることはできません;
メソッドは Final にすることができます;
メソッドがチェックされていない例外をスローする場合、クラスをサービスに入れてはなりません 、例外を処理し、例外から回復できる EJB でない限り。
実装方法: 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); } }
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 サイトの他の関連記事を参照してください。