Spring フレームワークを使用する場合、クラスが @Service と @Autowire を使用して別のクラスの他のオブジェクトを参照する場合、このクラスのインスタンスが spring の IOC 機能を通じて取得される場合にのみ、それらの依存オブジェクトを参照できることは誰もが知っています。正しく初期化されていない場合、それらの依存オブジェクトは null になります。
そこで問題となるのが、通常クラスの Spring IOC コンテナ (Spring マネージド Bean) にある Bean をどのように取得するかということです。
Spring のコンテキスト オブジェクト ApplicationContext が Bean を取得するための基礎であることは誰もが知っています。
Spring Boot では、次の 3 つの方法で Bean を取得できます。
関連する Springboot 学習ビデオ:
https://www.bilibili.com/video/BV1XQ4y1m7ex
方法 1
@PostConstructに注釈を付ける
PostConstruct アノテーションは、初期化を実行するために依存関係の注入が完了した後に実行する必要があるメソッドで使用されます。このメソッドは、クラスをサービスに追加する前に呼び出す必要があります。
依存関係の注入をサポートするすべてのクラスは、このアノテーションをサポートする必要があります。PostConstruct のアノテーションが付けられたメソッドは、クラスがリソースの注入を要求していない場合でも呼び出す必要があります。このアノテーションを付けられるメソッドは 1 つだけです。
PostConstruct アノテーションを適用するメソッドは、次の基準をすべて遵守する必要があります。
- EJB 仕様で定義されている EJB インターセプターの場合を除き、メソッドにはパラメーターを含めることはできません。EJB 仕様で定義されている場合、メソッドは InvocationContext オブジェクトを受け取ります。
- このメソッドの戻り値の型は void である必要があります。
- メソッドはチェック例外をスローしてはなりません。
- PostConstruct を適用する方法は、パブリック、プロテクト、パッケージ プライベート、またはプライベートのいずれかにすることができます。
- アプリケーションクライアントを除き、メソッドを静的にすることはできません。
- このメソッドは最終的なものにすることもできます。
- メソッドがチェックされていない例外をスローした場合、例外を処理して回復できる EJB でない限り、クラスをサービス状態にしてはいけません。
- Spring Boot の学習ノート、これは包括的すぎます。
方法2
開始クラス ApplicationContext
実装方法: springbootのスタートアップクラスに静的変数ApplicationContextを定義し、コンテナのgetBeanメソッドを使用して依存オブジェクトを取得します。Spring Boot の基本チュートリアルと実践例をお勧めします: https://github.com/javastacks/javastack
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);
}
上記の 3 つの方法は家主によってテストされており、完全に使用できます。