Spring Boot での依存関係の注入: カーテンの向こうの魔術師
Spring Boot が、どういうわけかあなたが必要なものを知っていて、銀の大皿に乗せて渡してくれる魔法の執事のように感じたことはありませんか?それは基本的に 依存関係の注入 (DI) です。あなたはおそらく、DI を 100 回も使用したことがあるでしょう。一体、Spring は何をいつ注入するかをどのようにして知っているのでしょうか?
そう思われる方は、ぜひご参加ください! Spring Boot の DI がどのようにウィザードリーを実行するのかについて、楽しい舞台裏のツアーに参加します。まず、Bean、@Autowired、および Bean のライフサイクル (生成から破棄まで) を管理する方法から始めます。このブログを終える頃には、新しく見つけた DI の知識をプロのように活用できるようになっているでしょう。
平たく言えば、Dependency Injection は食料品を自分で買いに行く代わりに自宅まで配達してもらうようなものです。これは、依存関係 (Bean) を「注入」する責任を Spring に委任することで、手動でオブジェクトを作成したり、そのライフサイクルについて心配したりする必要がなくなるようにすることです。
あなたは忙しいキッチン (アプリケーション) を運営するシェフであると想像してください。必要なたびに卵、牛乳、砂糖を買いに行く時間はありません。誰か (たとえば Spring) が、あなたが必要とするすべてのものを、あなたが必要とするときに正確に 魔法のように 届けてくれたら素晴らしいと思いませんか?
それはまさに Spring DI の機能です。必要なすべての要素 (Bean) を見つけて、指を動かすことなくコードに注入します。かなり素敵ですね?
さて、ここで魔法が起こります。 SpringApplication.run() を使用して Spring Boot アプリを実行すると、Spring は ApplicationContext をブートストラップします。これは執事の取扱説明書と考えてください。何をいつ取得するかを正確に知っています。
段階的に見てみましょう:
Container Initialization: SpringApplication.run() を押すと、Spring コンテナ (別名 ApplicationContext) が動作を開始します。それは仮想レストランへのドアを開けるようなもので、そこではすべての準備が整っています。
Bean Creation: コンテナーはコードをスキャンして @Component、@Service、@Repository、または @Controller などの注釈を探します。これらはそれぞれ bean、つまり Spring によって管理されるオブジェクトになります。小麦粉、砂糖、卵など、キッチンに欠かせない材料と考えてください。
BeanFactory による救済: Spring Boot は BeanFactory を使用してこれらの Bean を作成および管理します。この工場は、いつ、どのように Bean を作成するかを正確に把握しており、必要なときに確実に利用できるようにします。
Dependency Injection: Bean の準備が完了すると、Spring は @Autowired でマークした場所にそれらを注入します。それは、コーヒーを作るだけでなく、コーヒーを必要な正確なカウンターに届けるバリスタがいるようなものです。考える必要さえありません。すべてが 表示されるだけです 。
ああ、古き良き @Autowired アノテーションですね。 Spring がどのようにして依存関係を注入する場所を魔法のように判断するのか不思議に思ったことはありませんか?これは、ユーザーのニーズとレジストリ内の適切な Bean を照合する探偵のようなものです。
仕組みは次のとおりです:
Type Matching: Spring は @Autowired を認識すると、コンテナ内で同じタイプの Bean を探します。あなたがコーヒー豆 (CoffeeService クラス) を注文したと想像してください。Spring はその Bean リポジトリを調べて、「ああ、それはあるよ!」と言いました。注射させてください。」
修飾子: しかし、同じタイプの Bean が複数ある場合はどうなるでしょうか?その場合、Spring が異常を起こして「NoUniqueBeanDefinitionException」のような例外をスローする可能性があります。でも心配しないでください。@Qualifier を使用して注入する Bean を指定することで Spring を落ち着かせることができます:
@Autowired @Qualifier("espressoBean") private CoffeeService coffeeService;
public class CoffeeShop { private final CoffeeService coffeeService; @Autowired public CoffeeShop(CoffeeService coffeeService) { this.coffeeService = coffeeService; } }
Spring は自動操縦を開始し、コンストラクターに Bean を注入します。これで準備完了です。
Spring Boot の Bean は単なるオブジェクトではありません。彼らは、起源の物語、充実したキャリア、そして最終的な退職を備えた本格的な生活を送っています。 Bean のライフサイクルを追ってみましょう:
インスタンス化 (誕生): まず、Spring は Bean のインスタンスを作成します。これは豆の誕生のようなものです。春は「さあ、おちびちゃん!」と言いました。それをコンテナに渡します。
Dependency Injection: Bean を作成した後、Spring は Bean に依存関係 (ケーキのレシピの材料など) を追加します。ここで @Autowired が活躍します。 Bean は適切に動作するために必要なものをすべて取得します。
Post-Initialization: @PostConstruct アノテーションが付けられたメソッドがある場合、Spring は依存関係を注入した後にそれらを呼び出します。それは、作業に入る前に豆にペイントを塗り直すようなものです。
アクションの準備完了: これで、Bean は生き生きと動き始めました。世界に挑む準備はできています!
Pre-Destruction (Retirement): アプリケーションがシャットダウンすると、Spring は @PreDestroy メソッドを呼び出して Bean を正常に終了します。これは Bean の退職パーティーであり、リソースをクリーンアップします。
Bean の破壊: 最後に、Bean が破壊されます。安らかにお休みください。
コードでこれらのライフサイクル イベントを追跡する方法は次のとおりです:
@Component public class CoffeeBean { @PostConstruct public void onStart() { System.out.println("Bean is ready to brew some coffee!"); } @PreDestroy public void onEnd() { System.out.println("Bean is retiring. Goodbye, world!"); } }
すべての豆の寿命が同じというわけではありません。 Spring Boot では、Bean に対してさまざまな スコープ (基本的には存続期間) を定義できます。最も一般的な 2 つは次のとおりです:
シングルトン (デフォルト): Bean のインスタンスは 1 つだけあり、アプリケーション全体で共有されます。コーヒーショップ全体に 1 台のエスプレッソ マシンがあるようなものです。
プロトタイプ: Bean の新しいインスタンスは、必要になるたびに作成されます。注文ごとに淹れたてのエスプレッソマシンを用意しているところを想像してみてください。リソースを大量に消費しますが、必要な場合もあります。
@Component @Scope("prototype") public class LatteMachine { // This bean is made fresh for every use }
それでは、SpringApplication.run() を使用して Spring Boot アプリを実行すると何が起こるかについて話しましょう。このメソッドは、DI プロセス全体を開始するグランドマスターです。
Spring Boot アプリケーションをコーヒー ショップとして考えてください。あなたはオーナーであり、豆はコーヒー、ミルク、砂糖などの材料です。これらの材料を自分で管理する代わりに、すべてを取り出して正確な場所に届けるバリスタ (Spring コンテナ) がいます。必要です。
あなたがしなければならないのは、注文を出すこと (@Autowired フィールドの設定) だけで、残りはバリスタが処理し、依存関係に満ちた一杯のコーヒーを顧客のために完璧に淹れます (アプリケーション)。
結局のところ、Dependency Injection こそが Spring Boot を強力なフレームワークにしているのです。これにより、作業が簡素化され、Bean が管理され、コードの保守と拡張が容易になります。
カーテンの後ろを覗いてみると、多くの開発者が当然のことと思っているスーパーパワーを手にしていることになります。さあ、今のウィザードのように DI を使い始めてください。次回 @Autowired を見るときは、内部で何が起こっているのかが正確にわかるでしょう。
このブログが Spring Boot DI についての理解を深め、笑顔になっていただければ幸いです。さあ、豆を注入して、その様子を友達に見せてみましょう!
楽しくてためになる、わかりやすいブログはいかがでしょうか?さらに微調整が必要な場合はお知らせください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3