2023 春の 8 部構成エッセイ - 面接の質問

春の総覧(10)

1. 春とは何ですか?

Spring は、ビジネス ロジック層とエンタープライズ レベルのアプリケーション開発の他の層の間の結合問題を解決するために、ロッド ジョンソンによって最初に作成された軽量の Java 開発フレームワークです。これは、Java アプリケーション開発のための包括的なインフラストラクチャ サポートを提供する、階層化された JavaSE/JavaEE フルスタック (ワンストップ) 軽量オープン ソース フレームワークです。Spring がインフラストラクチャを担当するため、Java 開発者はアプリケーション開発に集中できます。Spring の最も基本的な使命は、エンタープライズ レベルのアプリケーション開発の複雑さを解決すること、つまり Java 開発を簡素化することです。

Spring は多くのことができます。エンタープライズ レベルの開発のための豊富な機能を提供しますが、これらの機能の最下位層は、依存関係の注入 (依存性注入、DI) とアスペクト指向プログラミング (アスペクト指向プログラミング、 AOP)

Java 開発の複雑さを軽減するために、Spring は次の 4 つの主要な戦略を採用しています。

  • POJO ベースの軽量かつ低侵襲プログラミング。
  • 依存関係の注入とインターフェイス指向による疎結合。
  • 側面と規約に基づいた宣言型プログラミング。
  • アスペクトとテンプレートを使用して定型コードを削減します。

2. Spring フレームワークの設計目標、設計コンセプト、およびコアは何ですか

**Spring の設計目標: **Spring は、開発者にワンストップの軽量アプリケーション開発プラットフォームを提供します。

**Springの設計コンセプト: **JavaEE開発において、POJOとJavaBean開発手法をサポートし、アプリケーション指向開発を行い、OO(オブジェクト指向)設計手法を完全にサポートし、SpringはIoCコンテナによるオブジェクト結合関係管理を実現し、依存関係反転を実現します。 、オブジェクト間の依存関係を IoC コンテナに引き渡して、分離を実現します。

**Spring フレームワークのコア: **IoC コンテナーと AOP モジュール。IoC コンテナを通じて POJO オブジェクトとその結合関係を管理し、AOP を通じて動的かつ非侵入的な方法でサービスを強化します。IoC では連携コンポーネントを疎結合に保ちますが、AOP プログラミングではアプリケーション層全体で機能を分離して、再利用可能な機能コンポーネントを形成できます。

3. Spring の長所と短所は何ですか?

**アドバンテージ**

  • 便利な切り離し、開発の簡素化
    Spring は大規模なファクトリであり、すべてのオブジェクトの作成と依存関係の維持を Spring 管理に引き渡すことができます。
  • AOP プログラミングのサポート
    Spring は、パーミッションのインターセプトやプログラムの動作監視などの機能を便利に実装できるアスペクト指向プログラミングを提供します。
  • 宣言型トランザクションのサポート
    トランザクションの管理は、手動でプログラミングすることなく、構成のみで完了できます。
  • 便利なプログラムテスト
    Spring は Junit4 をサポートしており、アノテーションを通じて Spring プログラムを簡単にテストできます。
  • さまざまな優れたフレームワークの便利な統合
    Spring は、さまざまな優れたオープンソース フレームワークを排除するものではなく、さまざまな優れたフレームワーク (Struts、Hibernate、MyBatis など) を直接サポートします。
  • JavaEE API の使用の難しさを軽減する
    Spring は、JavaEE 開発で使用するのが非常に難しい一部の API (JDBC、JavaMail、リモート呼び出しなど) のパッケージ化を提供しており、これらの API の使用の難しさを大幅に軽減します。

**欠点**

  • Spring は明らかに非常に軽量なフレームワークですが、大きくて包括的であるように感じられます。
  • スプリングは反射に依存し、反射はパフォーマンスに影響します
  • 利用の敷居が高く、Springを使い始めるまでに時間がかかる

4. Spring の適用シナリオとは何ですか

**アプリケーション シナリオ: **SSH、SSM などを含む JavaEE エンタープライズ アプリケーション開発。

ばね値:

  • Spring は非侵入的なフレームワークであり、その目標は、アプリケーション コードのフレームワークへの依存を最小限に抑えることです。
  • Spring は、POJO を使用してアプリケーションを直接開発し、オペレーティング環境から分離できるようにする一貫したプログラミング モデルを提供します。
  • Spring は、アプリケーション設計スタイルのオブジェクト指向およびインターフェイス指向開発への変換を促進し、コードの再利用性とテスト容易性を向上させます。

5. Spring はどのようなモジュールで構成されていますか?

Spring には、1,300 以上の異なるファイルで構成される合計約 20 のモジュールがあります。これらのコンポーネントは、コア コンテナ (Core Container)、AOP (Aspect Oriented Programming) とデバイス サポート (Instrmentation)、データ アクセスと統合 (Data Access/Integration)、Web、メッセージ (Messaging)、テスト、およびその他の 6 つのモジュールに統合されています。 。以下は Spring 5 のモジュール構造図です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-698FA9RN-1692509211712) (06-春の面接の質問 (2020 最新版)-focus.アセット/image-20201020183306246.png)]

  • spring core: 制御の反転 (Inversion of Control、IOC) や依存関係の注入 (Dependency Injection、DI) 機能など、フレームワークの基本コンポーネントを提供します。
  • Spring Bean: ファクトリ パターンの古典的な実装である BeanFactory が提供されており、Spring は管理オブジェクトを Bean として参照します。
  • spring context: コア パッケージに基づいて構築された context パッケージは、フレームワーク スタイルのオブジェクト アクセス メソッドを提供します。
  • spring jdbc: JDBC 抽象化レイヤーを提供します。これにより、面倒な JDBC コーディングとデータベース ベンダー固有のエラー コード解析が不要になり、JDBC を簡素化するために使用されます。
  • spring aop: アスペクト指向プログラミングの実装を提供し、インターセプターやポイントカットなどをカスタマイズできるようにします。
  • spring Web: ファイルのアップロード、サーブレット リスナーを使用した IOC コンテナの初期化、Web 用の ApplicationContext など、Web 開発用の統合機能を提供します。
  • spring test: 主にテストのサポートを提供し、JUnit や TestNG を使用した Spring コンポーネントの単体テストと統合テストをサポートします。

6. Spring フレームワークではどのようなデザイン パターンが使用されていますか?

  1. ファクトリ モード: BeanFactory は、オブジェクト インスタンスの作成に使用される単純なファクトリ モードの具体化です。
  2. シングルトン モード: Bean のデフォルトはシングルトン モードです。
  3. プロキシ モード: Spring の AOP 関数は、JDK の動的プロキシと CGLIB バイトコード生成テクノロジを使用します。
  4. テンプレート方式: コードの重複の問題を解決するために使用されます。例: RestTemplate、JmsTemplate、JpaTemplate。
  5. オブザーバー モード: オブジェクト キーの 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクト (Spring のリスナーの実装 – ApplicationListener など) が通知され、更新されます。

7. コアコンテナ(スプリングコンテキストアプリケーションコンテキスト)モジュールの詳細説明

これは Spring フレームワークの基本機能を提供する基本 Spring モジュールであり、BeanFactory は Spring ベースのアプリケーションの中核となります。Spring フレームワークはこのモジュールの上に構築され、Spring をコンテナーにします。

Bean Factory は、実際のアプリケーション コードからアプリケーションの構成と依存関係を分離する制御機能の反転を提供するファクトリ パターンの実装です。最も一般的に使用されるのは org.springframework.beans.factory.xml.XmlBeanFactory で、XML ファイルの定義に従って Bean をロードします。コンテナーは XML ファイルから構成メタデータを読み取り、それを使用して完全に構成されたシステムまたはアプリケーションを作成します。

8. Spring フレームワークのさまざまな種類のイベントとは何ですか

Spring では、次の 5 つの標準イベントが提供されます。

  1. コンテキスト更新イベント (ContextRefreshedEvent): ConfigurableApplicationContext インターフェイスのfresh() メソッドが呼び出されたときにトリガーされます。
  2. コンテキスト開始イベント (ContextStartedEvent): このイベントは、コンテナーが ConfigurableApplicationContext の Start() メソッドを呼び出してコンテナーを開始/再起動するとトリガーされます。
  3. コンテキスト停止イベント (ContextStoppedEvent): このイベントは、コンテナーが ConfigurableApplicationContext の Stop() メソッドを呼び出してコンテナーを停止するとトリガーされます。
  4. コンテキスト閉じイベント (ContextClosedEvent): このイベントは、ApplicationContext が閉じられるとトリガーされます。コンテナがシャットダウンされると、コンテナが管理するすべてのシングルトン Bean が破棄されます。
  5. リクエスト処理イベント (RequestHandledEvent): Web アプリケーションでは、http リクエスト (リクエスト) が終了すると、このイベントがトリガーされます。Bean が ApplicationListener インターフェースを実装している場合、ApplicationEvent が発行されると Bean は自動的に通知されます。

9. Spring アプリケーションのさまざまなコンポーネントは何ですか?

Spring アプリケーションには通常、次のコンポーネントがあります。

  • インターフェイス - 機能を定義します。
  • Beanクラス-プロパティ、セッターおよびゲッターメソッド、関数などが含まれます。
  • Bean 構成ファイル - クラスに関する情報とその構成方法が含まれています。
  • Spring アスペクト指向プログラミング (AOP) - アスペクト指向プログラミングの機能を提供します。
  • ユーザープログラム-インターフェースを使用します。

10. Spring の使用方法にはどのようなものがありますか?

Spring を使用するには次の方法があります。

  • 本格的な Spring Web アプリケーションとして。
  • サードパーティの Web フレームワークとして、Spring Frameworks 中間層を使用します。
  • エンタープライズ Java Bean として、既存の POJO (Plain Old Java Object) をラップできます。
  • リモート使用用。

スプリング制御反転 (IOC) (13)

Spring IOC コンテナとは何ですか?

制御の反転は IoC (制御の反転) であり、従来はプログラム コードによって直接操作されていたオブジェクトを変換します。

オブジェクトを呼び出す権利はコンテナに与えられ、オブジェクトのコンポーネントの組み立てや管理はコンテナを通じて実現される。いわゆる「コントロール」

「転送」の概念は、コンポーネント オブジェクトに対する制御をプログラム コード自体から外部コンテナに転送することです。

Spring IOC は、オブジェクトの作成、オブジェクトの管理 (依存関係注入 (DI) 経由)、オブジェクトの組み立て、オブジェクトの構成、およびこれらのオブジェクトのライフサイクル全体の管理を担当します。

制御の反転 (IoC) は何をするのか

  • オブジェクトの作成と依存関係の維持を管理します。オブジェクトの作成は単純ではなく、オブジェクトの関係が複雑な場合、依存関係をプログラマが維持する必要があると、非常に頭の痛い作業になります。
  • 切り離し、コンテナは特定のオブジェクトを維持します
  • クラスの生成プロセスをホストします。たとえば、クラスの生成中に何らかの処理を実行する必要があります。最も直接的な例はプロキシです。処理のこの部分を引き渡すことができるコンテナ プログラムがある場合、コンテナの場合、アプリケーションはクラスがどのように完了するかを気にする必要はありません。

IOCの利点は何ですか?

  • IOC または依存関係の挿入により、アプリケーションのコード サイズが最小限に抑えられます。
  • これによりアプリケーションのテストが容易になり、単体テストにはシングルトンや JNDI ルックアップ メカニズムが必要なくなります。
  • 最小限のオーバーヘッドと最小限の侵入で疎結合が可能です。
  • IOC コンテナは、サービスをロードする際のハングリーな初期化と遅延ロードをサポートします。

Spring IoCの実装仕組み

Spring での IoC の実装原理は、ファクトリ モードとリフレクション メカニズムです。

例:

1 interface Fruit {
2 public abstract void eat();
3 }
4
5 class Apple implements Fruit {
6 public void eat(){
7 System.out.println("Apple");
8 }
9 }
10
11 class Orange implements Fruit {
12 public void eat(){
13 System.out.println("Orange");
14 }
15 }
16
17 class Factory {
18 public static Fruit getInstance(String ClassName) {
19 Fruit f=null;
20 try {
21 f=(Fruit)Class.forName(ClassName).newInstance();
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 return f;
26 }
27 }
28
29 class Client {
30 public static void main(String[] a) {
31 Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
32 if(f!=null){
33 f.eat();
34 }
35 }
36 }

SpringのIoCはどのような機能をサポートしているのか

Spring の IoC 設計は、次の機能をサポートしています。 依存関係の注入 依存関係のチェック コレクションの自動配線のサポート イニシャライザとデストロイアの指定

一部のメソッドのコールバックをサポートします (ただし、Spring インターフェイスを実装する必要があり、少し煩わしいです)

その中でも最も重要なのは依存関係の注入であり、XML 構成で言えば ref タグです。春に対応

RuntimeBeanReference オブジェクト。

IoC にとって最も重要なのはコンテナです。コンテナは Bean のライフサイクルを管理し、Bean の依存関係の注入を制御します。

BeanFactory と ApplicationContext の違いは何ですか?

BeanFactory と ApplicationContext は Spring の 2 つのコア インターフェイスであり、どちらも Spring コンテナとして使用できます。ここで、ApplicationContext は BeanFactory のサブインターフェースです。

依存関係

BeanFactory: Spring の最下位インターフェイスであり、さまざまな Bean の定義が含まれ、Bean 構成ドキュメントを読み取り、Bean のロードとインスタンス化を管理し、Bean のライフサイクルを制御し、Bean 間の依存関係を維持します。

ApplicationContext インターフェースは、BeanFactory を提供するだけでなく、BeanFactory から派生します。

いくつかの機能に加えて、より完全なフレームワーク機能も提供します。

  • MessageSource を継承するため、国際化がサポートされます。統合されたリソース ファイル アクセス方法。
  • Bean をリスナーに登録するためのイベントを提供します。
  • 複数の構成ファイルを同時にロードします。
  • それぞれがアプリケーションの Web 層などの特定の層専用の複数の (継承された) コンテキストを読み込みます。

ロード方法

BeanFactroy は遅延ロードを使用して Bean を注入します。つまり、Bean が使用されるとき (getBean() を呼び出すとき) にのみ、Bean がロードされてインスタンス化されます。このようにして、既存の Spring 構成の問題の一部を見つけることができません。Bean の特定のプロパティが挿入されていない場合、BeanFacotry がロードされた後、初めて getBean メソッドが呼び出されるまで例外はスローされません。

ApplicationContext: コンテナの起動時にすべての Bean を一度に作成します。このようにして、コンテナの起動時に Spring の設定エラーを見つけることができ、すべてをチェックするのに役立ちます。

依存関係プロパティが挿入されるかどうか。ApplicationContext が開始されると、すべての単一インスタンス Bean がプリロードされます。単一インスタンス Bean をプリロードすると、必要なときにそれらがすでに作成されているため待つ必要がなくなります。

基本的な BeanFactory と比較した場合、ApplicationContext の唯一の欠点はメモリ領域を占有することです。アプリケーションが多数の Bean を構成すると、プログラムの起動が遅くなります。

作成方法

BeanFactory は通常、プログラムによって作成されますが、ApplicationContext は、ContextLoader を使用するなど、宣言的に作成することもできます。

登録方法

BeanFactory と ApplicationContext は両方とも BeanPostProcessor をサポートします。

BeanFactoryPostProcessor が使用されますが、この 2 つの違いは、BeanFactory は手動で登録する必要があるのに対し、ApplicationContext は自動的に登録されることです。

Spring はコンテナをどのように設計するのか、BeanFactory と ApplicationContext の関係の詳細な説明

Spring の作者である Rod Johnson は、コンテナを表す 2 つのインターフェイスを設計しました。

  • ビーンファクトリー
  • アプリケーションコンテキスト

BeanFactory は単純かつ失礼ですが、HashMap として理解でき、Key は BeanName、

値はBeanインスタンスです。通常は、登録 (put) 関数とアクセス (get) 関数のみが提供されます。これを「低レベルコンテナ」と呼ぶことができます。

ApplicationContext は「高レベルのコンテナ」と呼ぶことができます。BeanFactory よりも多くの機能を備えているためです。彼は複数のインターフェースを継承しています。したがって、より多くの機能が搭載されています。たとえば、リソースの取得、さまざまなメッセージのサポート (JSP タグのサポートなど)、BeanFactory のツールレベルのサポートなどです。彼の名前を見るとわかるように、これは BeanFactory のようなファクトリーではなく、大きなコンテナ全体のすべての機能を表す「アプリケーション コンテキスト」です。このインターフェイスは、Spring ソース コードを読む人にとって最も馴染みのあるメソッドであるリフレッシュ メソッドを定義し、コンテナ全体をリフレッシュする (つまり、すべての Bean を再ロード/リフレッシュする) ために使用されます。

もちろん、これら 2 つの主要なインターフェイス以外にも補助的なインターフェイスがあるため、ここでは紹介しません。

BeanFactory と ApplicationContext の関係

「下位コンテナ」と「上位コンテナ」の関係をより直観的に示すために、ここでは一般的に使用される

ClassPathXmlApplicationContext クラスを使用して、コンテナ全体の階層的な UML 関係を表示します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-p5IbE3qY-1692509211712) (06-春の面接の質問 (2020 最新版) - フォーカス。アセット/コンテナ階層 .png)]

少し複雑ですか?パニックにならないでください。説明しましょう。

一番上のものが BeanFactory で、その下の緑色の 3 つはすべて機能拡張インターフェースなので、ここでは説明しません。

以下の ApplicationContext に属するピンク色の「高レベル コンテナ」を見てください。これは「低レベル コンテナ」に依存しています。ここでは継承ではなく依存関係について話しています。彼は「低レベルコンテナ」の getBean 関数に依存しています。

できる。高度なコンテナにはさらに多くの機能があります。さまざまな情報ソースをサポートし、ファイル リソースにアクセスでき、アプリケーション イベント (オブザーバー モード) をサポートします。

通常、ユーザーに表示されるのは「高度なコンテナ」です。しかし、BeanFactory も非常に便利です。左側の灰色の部分は「下位コンテナ」で、BeanのロードとBeanの取得のみを行います。コンテナーのその他の高度な機能は使用できません。たとえば、上の図の更新では、Bean ファクトリ、ライフサイクル イベント コールバックなどのすべての構成が更新されます。

まとめ

ここまで述べてきましたが、Spring IoC について理解できたでしょうか。要約は次のとおりです。 Spring では、IoC は低レベルのコンテナーのみを使用して 2 つのステップで実現できます。

  1. 構成ファイルをロードし、それを BeanDefinition に解析してマップに配置します。

  2. getBeanを呼び出すと、BeanDefinitionが属するMapから、

クラスオブジェクトがインスタンス化されると同時に、依存関係がある場合にはgetBeanメソッドが再帰的に呼び出され、依存関係の注入が完了します。

上記はSpringの低レベルコンテナ(BeanFactory)のIoCです。

上位コンテナ ApplicationContext には下位コンテナの機能が含まれており、refresh template メソッドを実行すると、コンテナ全体の Bean が更新されます。同時に、高度なコンテナとしては多すぎる機能が含まれています。一言で言えば、彼は単なる IoC ではありません。彼はさまざまな情報源をサポートしており、

BeanFactory ツール クラス。階層コンテナのサポート、ファイル リソースへのアクセスのサポート、イベント リリース通知のサポート、インターフェイス コールバックのサポートなどをサポートします。

ApplicationContext の通常の実装は何ですか?

FileSystemXmlApplicationContext: このコンテナは XML ファイルから Bean の定義をロードします。XML Bean 構成ファイルの完全なパス名をそのコンストラクターに提供する必要があります。

ClassPathXmlApplicationContext: このコンテナは、XML ファイルから Bean 定義もロードします。このコンテナはクラスパスで Bean 構成を検索するため、ここでクラスパスを正しく設定する必要があります。

WebXmlApplicationContext: このコンテナは、WEB アプリケーションのすべての Bean を定義する XML ファイルをロードします。

Spring の依存性インジェクションとは何ですか?

制御 IoC の反転は大きな概念であり、さまざまな方法で実装できます。主な実装方法は 2 つあります: 依存性注入と依存性ルックアップ 依存性注入: IoC と比較して、依存性注入 (DI) は IoC の設計概念をより正確に表します。いわゆる依存関係の注入 (Dependency Injection)、つまりコンポーネント間の依存関係は、アプリケーション システムの実行時にコンテナによって決定されます。つまり、コンテナは、特定の依存関係のターゲット オブジェクト インスタンスを、関連する各コンポーネントに動的に注入します。間のアプリケーションシステムで。コンポーネントは場所のクエリを実行せず、コンテナが依存関係を判断するための共通の Java メソッドを提供するだけです。

依存性注入の基本原則

依存関係注入の基本原則は、アプリケーション コンポーネントがリソースや他の依存関係にある連携オブジェクトを検索する責任を負わないことです。オブジェクトを構成する作業は IoC コンテナの責任であり、「リソースの検索」ロジックはアプリケーション コンポーネントのコードから抽出され、IoC コンテナに渡される必要があります。コンテナはコンポーネントのアセンブリのみを担当し、依存関係を満たすオブジェクトをプロパティ (JavaBean のセッター) またはコンストラクターを通じて必要なオブジェクトに渡します。

依存関係注入の利点は何ですか

依存関係注入がより一般的である理由は、それがより望ましい方法であるためです。依存関係の検索の全責任をコンテナーに持たせ、マネージド コンポーネントは JavaBean セッター メソッドまたはパラメーター化されたコンストラクターまたはレシーバーを公開するだけで済みます。

コンテナが初期化時にオブジェクトの依存関係をアセンブルできるようにするポート。依存ルックアップ方法と比較した場合、その主な利点は次のとおりです。

  • ルックアップ操作はアプリケーション コードから完全に独立しています。
  • コンテナに依存しない API により、コンテナの外部でアプリケーション オブジェクトを簡単に使用できるようになります。
  • 特別なインターフェイスは必要なく、ほとんどのオブジェクトはコンテナから完全に独立できます。

依存関係注入の実装にはどのような種類がありますか?

依存性注入は現在最も一般的な IoC 実装であり、依存性注入はインターフェイス インジェクション (Interface Injection)、セッター メソッド インジェクション (Setter Injection)、コンストラクター インジェクション (Constructor Injection) に分けられます。

注射) の 3 つの方法があります。中でもインターフェースインジェクションは柔軟性や使いやすさが劣るため、Spring 4以降は廃止されました。

コンストラクターの依存関係の注入: コンストラクターの依存関係の注入は、一連のパラメーターを持つクラスのコンストラクターをトリガーするコンテナーによって実装されます。各パラメーターは他のクラスへの依存関係を表します。

Setter メソッド インジェクション: Setter メソッド インジェクションは、コンテナが引数なしのコンストラクタまたは引数なしの静的ファクトリ メソッドを呼び出して Bean をインスタンス化した後、Bean の setter メソッドを呼び出すことで、setter ベースの依存性注入を実現します。

コンストラクターの依存関係の注入とセッター メソッドの注入の違い

コンストラクターインジェクション セッターインジェクション
部分注入なし 部分的に注入された
セッタープロパティをオーバーライドしません セッタープロパティをオーバーライドします
変更を行うと新しいインスタンスが作成されます 変更を加えても新しいインスタンスは作成されません
多くのプロパティを設定するのに適しています 少数のプロパティを設定する場合に適しています

コンストラクター インジェクションとセッター メソッド インジェクションの両方の依存関係メソッドを使用できます。最良の解決策は、必須の依存関係にはコンストラクター パラメーターを使用し、オプションの依存関係にはセッター メソッドを使用することです。

春豆 (19) 春豆とは?

Spring Bean は、Spring アプリケーションのバックボーンを形成する Java オブジェクトです。これらは、Spring IOC コンテナーによって初期化、アセンブル、および管理されます。これらの Bean は、コンテナ内で構成されたメタデータから作成されます。たとえば、XML ファイルの形式で定義されます。

Spring Bean 定義には何が含まれますか?

Spring Bean 定義には、コンテナが Bean、そのライフサイクルの詳細、およびその依存関係について知っておく必要があるすべての構成メタデータが含まれています。

Springコンテナに構成メタデータを提供する方法を作成するにはどうすればよいですか? Springにはいくつかの設定方法があります

Spring コンテナに構成メタデータを提供するには 3 つの重要な方法があります。

  • XML 設定ファイル。
  • 注釈ベースの構成。
  • Java ベースの構成。

Spring構成ファイルにはどのような情報が含まれていますか

Spring 構成ファイルは、クラス情報を含む XML ファイルであり、クラスの構成方法と相互の呼び出し方法が記述されています。

Spring が XML に基づいて Bean を注入するためのいくつかの方法

  1. メソッドの注入を設定します。

  2. コンストラクタインジェクション: ①パラメータの位置をインデックスで設定; ②パラメータの型を型で設定;

  3. 静的なファクトリーインジェクション。

  4. インスタンスファクトリー。

クラスのスコープはどのように定義しますか?

Spring で Bean を定義する場合、Bean のスコープを宣言することもできます。これは、Bean 定義のscope属性を通じて定義できます。たとえば、Spring が毎回新しい Bean インスタンスを生成する必要がある場合、Bean のスコープ属性はプロトタイプとして指定されます。一方、Bean は使用されるたびに同じインスタンスを返す必要があり、Bean のスコープ属性はシングルトンに設定する必要があります。

Spring でサポートされるいくつかの Bean の範囲について説明する

Spring フレームワークは、次の 5 つの Bean スコープをサポートします。

  • singleton : Bean には、Spring ioc コンテナごとにインスタンスが 1 つだけあります。
  • プロトタイプ: Bean 定義には複数のインスタンスを含めることができます。
  • request: Bean は http リクエストごとに作成され、このスコープは Web ベースの SpringApplicationContext の場合にのみ有効です。
  • セッション: HTTP セッションでは、Bean 定義はインスタンスに対応します。このスコープは、Web ベースの Spring ApplicationContext の場合にのみ有効です。
  • global-session: グローバル HTTP セッションでは、Bean 定義は

実例。このスコープは、Web ベースの Spring ApplicationContext の場合にのみ有効です。

注: デフォルトの Spring Bean スコープはシングルトンです。Bean の作成と破棄を頻繁に行うとパフォーマンスに大きなオーバーヘッドが生じるため、プロトタイプ スコープの使用には慎重な検討が必要です。

Spring フレームワークのシングルトン Bean はスレッドセーフですか?

いいえ、Spring フレームワークのシングルトン Bean はスレッドセーフではありません。

Spring の Bean はデフォルトでシングルトン モードに設定されており、Spring フレームワークはシングルトン Bean に対してマルチスレッドのカプセル化処理を実行しません。

実際、ほとんどの場合、Spring Bean はステートレス (dao クラスなど) であり、すべての Bean もある程度安全ですが、Bean がステートフルである場合 (ビュー モデル オブジェクトなど)、開発者が次のことを行う必要があります。スレッドの安全性を確保する最も簡単な方法は、Bean のスコープを変更することです。

「singleton」を「prototype」に変更すると、リクエスト Bean が new Bean() と同等になり、スレッドの安全性が保証されます。

  • ステートフルであるということは、データを保存する機能を持つことです。
  • ステートレスとは、データが保存されないことを意味します。

Spring はスレッドの同時実行の問題をどのように処理しますか?

一般に、マルチスレッド環境ではステートレス Bean のみを共有できます。Spring では、一部の Bean で非スレッドセーフ状態を処理するために ThreadLocal を使用するため、ほとんどの Bean をシングルトン スコープとして宣言できます。スレッド セーフの問題を解決します。

ThreadLocal メカニズムとスレッド同期メカニズムはどちらも、複数のスレッドにおける同じ変数のアクセス競合の問題を解決するように設計されています。同期メカニズムは「time-for-space」方式を採用し、変数は 1 つだけ提供され、異なるスレッドが使用されます。

ロックを取得する必要があり、ロックを取得していないスレッドはキューに入れる必要があります。そしてThreadLocalは「時間のための空間」という手法を採用しています。

ThreadLocal は各スレッドに変数の独立したコピーを提供し、複数のスレッドからのデータ アクセスの競合を分離します。各スレッドには変数の独自のコピーがあるため、変数を同期する必要はありません。ThreadLocal はスレッドセーフな共有オブジェクトを提供します。マルチスレッド コードを作成する場合、安全でない変数が ThreadLocal にカプセル化される可能性があります。Spring フレームワークにおける Bean のライフサイクルについて説明する

従来の Java アプリケーションでは、Bean のライフサイクルは非常に単純です。Java キーワード new を使用して Bean がインスタンス化されると、Bean を使用できるようになります。Bean が使用されなくなると、Java によって自動的にガベージ コレクションが行われます。対照的に、Spring コンテナ内の Bean のライフサイクルは比較的複雑です。Bean の作成プロセスをカスタマイズするには、Spring が提供する拡張ポイントを使用する必要がある場合があるため、Spring Bean のライフサイクルを正しく理解することが非常に重要です。以下の図は、Spring アプリケーション コンテキストに Bean をロードする一般的なライフサイクル プロセスを示しています。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-gG50NCsq-1692509211713) (06-春の面接の質問 (2020 最新版) - フォーカス。アセット/Bean ライフサイクル.png)]

Bean は Spring コンテナ内で作成から破棄までいくつかの段階を経ます。各段階は Spring による Bean の管理方法に合わせてカスタマイズできます。

ご覧のとおり、Bean ファクトリは、Bean の準備が整う前にいくつかの起動ステップを実行します。

上の図を詳しく説明します。

Spring は Bean をインスタンス化します。

Spring は、値と Bean 参照を Bean の対応するプロパティに挿入します。

Bean が BeanNameAware インターフェースを実装している場合、Spring は Bean の ID を setBeanName() メソッドに渡します。

Bean が BeanFactoryAware インターフェースを実装している場合、Spring は setBeanFactory() メソッドを呼び出します。

メソッド。BeanFactory コンテナ インスタンスを渡します。

Bean が ApplicationContextAware インターフェースを実装している場合、Spring は setApplicationContext() メソッドを呼び出して、Bean が配置されているアプリケーション コンテキストの参照を渡します。

Bean が BeanPostProcessor インターフェースを実装している場合、Spring はそのポストを呼び出します。

ProcessBeforeInitialization()方法;

Bean が InitializingBean インターフェースを実装している場合、Spring はその afterPropertiesSet() メソッドを呼び出します。同様に、Bean が initmethod を使用して初期化メソッドを宣言する場合、

このメソッドも呼び出されます。

Bean が BeanPostProcessor インターフェースを実装している場合、Spring はそのポストを呼び出します。

ProcessAfterInitialization() メソッド。この時点で、Bean はアプリケーションで使用できるようになり、アプリケーション コンテキストが破棄されるまで常にアプリケーション コンテキスト内に存在します。

Bean が DisposableBean インターフェイスを実装している場合、Spring はその destroy() インターフェイス メソッドを呼び出します。

法。同様に、Bean が destroy-method を使用して destroy メソッドを宣言した場合、そのメソッドも呼び出されます。

Spring コンテナを作成してロードする方法がわかりました。しかし、空の容器にはそれほど価値はなく、何かを入れるまでは何も入っていません。春からの注文

DI (Dependency Injection) の恩恵を受けるには、アプリケーション オブジェクトを Spring コンテナーにアセンブルする必要があります。

重要な Bean ライフサイクル メソッドはどれですか? 過負荷にできますか?

Bean のライフサイクルには 2 つの重要なメソッドがあります。1 つ目はセットアップであり、Bean をコンテナにロードします。

時間が呼ばれます。2 番目のメソッドは、コンテナがクラスをアンロードするときに呼び出される分解です。

Bean タグには 2 つの重要な属性 (init-method と destroy-method) があります。これらを使用すると、初期化方法とログアウト方法を自分でカスタマイズできます。対応するアノテーション ( @PostConstruct および @PreDestroy ) もあります。

Spring の内豆とは何ですか? Spring インナー Bean とは何ですか?

Spring フレームワークでは、Bean が別の Bean のプロパティとしてのみ使用される場合、それを内部 Bean として宣言できます。内部 Bean は、セッターを使用して「プロパティ」を注入し、コンストラクターを使用して「構築パラメータ」を注入することによって実装できます。内部 Bean は通常匿名であり、スコープは通常プロトタイプです。

Spring で Java コレクションを注入するにはどうすればよいですか?

Spring では、コレクションに対して次の構成要素が提供されます。 型は、値のリストを挿入するために使用され、同一の値を許可します。

型は一連の値を挿入するために使用されます。同一の値は許可されません。

この型は、キーと値のペアのセットを挿入するために使用され、キーと値の両方の型は String のみにすることができます。

豆配線とは何ですか?

アセンブリ (Bean アセンブリ) とは、Spring コンテナー内で Bean を組み立てることを指します。 ただし、コンテナーが Bean の依存関係と、依存関係注入を通じて Bean を組み立てる方法を知る必要がある場合に限ります。

Bean の自動配線とは何ですか?

Spring フレームワークでは、構成ファイルで Bean の依存関係を設定する優れたメカニズムです。

Spring コンテナは、相互に連携する Bean を自動的に組み立てることができます。つまり、コンテナは設定を必要とせず、

Bean 間のコラボレーションは、Bean ファクトリを通じて自動的に処理されます。これは、Spring が Bean に渡せることを意味します。

ファクトリの注入メソッドは、Bean 間の依存関係を自動的に処理します。自動配線は、Bean ごとまたは特定の Bean ごとに設定できます。

自動配線のさまざまな方法を説明します。Spring 自動配線 Bean の方法は何ですか?

Spring では、オブジェクトは、それらに関連付けられた他のオブジェクトを検索したり作成したりする必要はありません。コンテナーは、相互に連携する必要があるオブジェクト参照を各オブジェクトに割り当てる責任を負い、autowire を使用して自動読み込みモードを構成します。

Spring Framework の XML 構成には 5 種類の自動アセンブリがあります。

  • no: デフォルトの方法では自動アセンブリは実行されず、Bean は ref 属性を手動で設定することによってアセンブルされます。
  • byName: Bean 名によって自動的にアセンブルします。Bean のプロパティが別の Bean の名前と同じ場合、自動的にアセンブルされます。
  • byType: パラメータのデータ型によって自動配線します。
  • コンストラクター: コンストラクターはアセンブリに使用され、コンストラクターのパラメーターは byType によってアセンブルされます。
  • autodetect: 自動検出。構築メソッドがある場合はconstructで自動アセンブルされ、ない場合はbyTypeで自動アセンブルされます。

@Autowired アノテーションを使用した自動配線のプロセスは何ですか?

@Autowired アノテーションを使用して、指定した Bean を自動接続します。@Autowired アノテーションを使用する前に、Spring 構成ファイルでそれを構成する必要があります。

Spring IoC を開始すると、コンテナーは自動的に

AutowiredAnnotationBeanPostProcessor ポストプロセッサでは、コンテナが @Autowied、@Resource、または @Inject をスキャンすると、IoC コンテナ内で必要な Bean が自動的に検索され、オブジェクトのプロパティにアセンブルされます。@Autowired を使用する場合は、まずコンテナ内の対応するタイプの Bean をクエリします。

  • クエリ結果が 1 つだけの場合は、@Autowired で指定されたデータに Bean をアセンブルします。
  • 複数のクエリ結果がある場合、@Autowired は名前で検索します。
  • 上記の検索の結果が空の場合、例外がスローされます。回避策として、required=false を使用します。

自動配線の制限は何ですか?

自動ワイヤリングの制限は次のとおりです。 オーバーライド: 依存関係を定義して構成する必要があります。つまり、自動ワイヤリングは常にオーバーライドする必要があります。

プリミティブ データ型: プリミティブ データ型、文字列文字列、クラスなどの単純なプロパティをオートワイヤリングすることはできません。

ファジー機能: 自動配線は明示的な配線ほど正確ではないため、可能であれば明示的な配線をお勧めします。

Spring で null と空の文字列を挿入できますか?

できる

スプリングの注釈 (8)

Java ベースの Spring アノテーション構成とは何ですか? アノテーションの例をいくつか示します

Java ベースの構成。XML ファイルの代わりにいくつかの Java アノテーションを使用して Spring 構成のほとんどを行うことができます。

@Configuration アノテーションを例に挙げると、これはクラスが Bean 定義とみなせることをマークするために使用されます。

Spring IOC コンテナによって使用されます。

もう 1 つの例は、@Bean アノテーションです。これは、このメソッドが Spring アプリケーション コンテキストで Bean として登録されたオブジェクトを返すことを示します。

1	@Configuration
2	public class StudentConfig {
3	@Bean
4	public StudentBean myStudent() {
5	return new StudentBean();
6	}
7	}

注釈アセンブリを有効にするにはどうすればよいですか?

アノテーション アセンブリはデフォルトでは有効になっていないため、アノテーション アセンブリを使用するには、Spring 構成ファイルで要素を構成する必要があります。

@Component、@Controller、@Repository、@Service の違いは何ですか?

@Component: これにより、Java クラスが Bean としてマークされます。これは、Spring 管理コンポーネントの一般的なステレオタイプです。Spring のコンポーネント スキャン メカニズムは、コンポーネントを取得してアプリケーション環境に取り込むことができるようになりました。

@Controller: これにより、クラスが Spring Web MVC コントローラーとしてマークされます。これでマークされた Bean は、IoC コンテナに自動的にインポートされます。

@Service: このアノテーションはコンポーネント アノテーションを特殊化したものです。@Component アノテーションに追加の動作は提供されません。より適切な方法でインテントを指定できるため、サービス層クラスで @Component の代わりに @Service を使用できます。

@Repository: このアノテーションは、同様の目的と機能を持つ @Component アノテーションを特殊化したものです。これにより、DAO にさらなる利点がもたらされます。DAO を IoC コンテナにインポートし、未チェック例外を Spring DataAccessException に変換できるようにします。

@Required アノテーションは何をするのか

このアノテーションは、Bean によって定義された明示的なプロパティ値または自動アセンブリを通じて、構成時に Bean のプロパティを設定する必要があることを示します。@Required アノテーションの Bean プロパティが設定されていない場合、コンテナはスローします。

BeanInitializationException。例:

1	public class Employee {
2	private String name;
3	@Required
4	public void setName(String name){
5	this.name=name;
6	}
7	public string getName(){
8	return name;
9	}
10	}

@Autowired アノテーションは何をするのか

@Autowired はデフォルトで型アセンブリに従って挿入され、デフォルトでは依存オブジェクトが存在する必要があります (required 属性を false に設定できます)。@Autowired アノテーションを使用すると、自動配線がどこでどのように行われるかをより詳細に制御できます。その使用法は @Required と同じで、任意の名前や複数のパラメーターを使用してセッター メソッド、コンストラクター、プロパティ、または PN メソッドを変更します。

1	public class Employee {
2	private String name;
3	@Autowired
4	public void setName(String name) {
5	this.name=name;
6	}
7	public string getName(){
8	return name;
9	}
10	}

@Autowired と @Resource の違い

@Autowired はコンストラクター、メンバー変数、Setter メソッドに使用できます。

@Autowired と @Resource の違い

@Autowired はデフォルトで型アセンブリに従って挿入され、デフォルトでは依存オブジェクトが存在する必要があります (required 属性を false に設定できます)。

@Resource はデフォルトで名前によってアセンブルおよび注入され、名前に一致する Bean が見つからない場合にのみ、タイプによってアセンブルおよび注入されます。

@Qualifier アノテーションは何をするのか

同じタイプの複数の Bean を作成し、そのうちの 1 つだけをプロパティに接続したい場合は、 @Autowired で @Qualifier アノテーションを使用して、どの Bean を接続するかを指定することで曖昧さを解消できます。

@RequestMapping アノテーションの用途は何ですか?

@RequestMapping アノテーションは、特定の HTTP リクエスト メソッドを、対応するリクエストを処理するコントローラー内の特定のクラス/メソッドにマップするために使用されます。このアノテーションは、次の 2 つのレベルで適用できます。

  • クラスレベル: リクエストされた URL のマッピング
  • メソッド レベル: URL と HTTP リクエスト メソッドのマッピング

春のデータアクセス (14)

オブジェクト/リレーショナル マッピング統合モジュールの解釈

ORM モジュールを提供することで、Spring は直接 JDBC 上でオブジェクト/リレーショナル マッピング (ORM) ツールを使用することをサポートし、Hiberate、JDO、iBATIS、JPA、TopLink、JDO、OJB などの主流の ORM フレームワークの統合をサポートします。Spring のトランザクション管理は、上記のすべての ORM フレームワークと JDBC もサポートしています。

Spring Framework で JDBC をより効果的に使用するにはどうすればよいですか?

Spring JDBC フレームワークを使用すると、リソース管理とエラー処理のオーバーヘッドが軽減されます。それで開発者は

データからデータにアクセスするためのステートメントとクエリを記述するだけです。Spring フレームワークによって提供されるテンプレート クラスの助けを借りて、JDBC をより効率的に使用することもできます。このテンプレートは JdbcTemplate と呼ばれます。

JDBC 抽象化と DAO モジュールについて説明する

JDBC 抽象化と DAO モジュールを使用することで、データベース コードは簡潔に保たれ、データベース リソースの誤ったクローズによって引き起こされる問題を回避でき、さまざまなデータベース エラー メッセージの上に統合された例外アクセス層が提供されます。また、Spring の AOP モジュールを使用して、Spring アプリケーションのオブジェクトにトランザクション管理サービスを提供します。

Spring DAO の用途は何ですか?

Spring DAO (Data Access Objects) は、JDBC、Hibernate、JDO などのデータ アクセス オブジェクトを作成します。

テクノロジーに質問することで、統一された方法で作業することが容易になります。これにより、ユーザーは永続化テクノロジーを簡単に切り替えることができます。

また、テクノロジごとに異なる例外のキャッチを心配することなくコードを作成できます。

Spring JDBC APIにはどのようなクラスが存在しますか?

Jdbcテンプレート

シンプルなJdbcテンプレート

NamedParameterJdbcTemplate

SimpleJdbc挿入

SimpleJdbcCall

Jdbcテンプレートとは

JdbcTemplate クラスは、データベース データの基本データ型またはオブジェクトへの変換、記述されたまたは呼び出し可能なデータベース操作ステートメントの実行、カスタム データ エラー処理の提供など、多くの便利なメソッドを提供します。

Spring を使用して Hibernate にアクセスするにはどうすればよいですか? Spring を使用して Hibernate にアクセスする方法は何ですか?

Spring で Hibernate にアクセスするには 2 つの方法があります。

  • Hibernate テンプレートとコールバックを使用した制御の反転
  • ernateDAOSupport と AOP インターセプター ノードの適用

HibernateDaoSupport を通じて Hib を拡張して Spring と Hibernate を組み合わせるにはどうすればよいですか?

Spring の SessionFactory を使用して LocalSessionFactory を呼び出します。統合プロセスは 3 つのステップに分かれています。

  • 配置the Hibernate SessionFactory
  • HibernateDaoSupport を継承して DAO を実装する
  • AOP がサポートするトランザクションでアセンブルする

Spring がサポートするトランザクション管理の種類と Spring トランザクションの実装方法は何ですか?

Spring は 2 種類のトランザクション管理をサポートしています。 プログラムによるトランザクション管理: これは、トランザクションをプログラムによって管理することを意味し、柔軟性に優れていますが、保守が困難です。

宣言型トランザクション管理: これは、ビジネス コードをトランザクション管理から分離できることを意味し、トランザクションの管理には注釈と XML 構成のみを使用する必要があります。

Springトランザクションの実装方法と原理

Spring トランザクションの本質は、実際にはデータベースによるトランザクションのサポートです。データベース トランザクションのサポートがなければ、

Spring ではトランザクション機能を提供できません。実際のデータベース層のトランザクションのコミットとロールバックは、binlog または redo ログを通じて実装されます。

Spring のトランザクション伝播動作について話す

Spring トランザクションの伝播動作は、複数のトランザクションが同時に存在する場合に Spring がこれらのトランザクションの動作をどのように処理するかを指します。

① PROPAGATION_REQUIRED: 現在のトランザクションがない場合は新しいトランザクションを作成し、現在のトランザクションがある場合はトランザクションに参加する最も一般的に使用される設定です。

② PROPAGATION_SUPPORTS: 現在のトランザクションをサポートします。現在トランザクションが存在する場合はトランザクションに参加し、現在トランザクションが存在しない場合は非トランザクションとして実行します。

③ PROPAGATION_MANDATORY: 現在のトランザクションをサポートします。現在トランザクションが存在する場合はトランザクションに参加し、現在トランザクションが存在しない場合は例外がスローされます。

④ PROPAGATION_REQUIRES_NEW: 新しいトランザクションを作成します。現在トランザクションの有無に関係なく、新しいトランザクションを作成します。

⑤ PROPAGATION_NOT_SUPPORTED: 非トランザクションで操作を実行し、現在のトランザクションが存在する場合は、現在のトランザクションを一時停止します。

⑥ PROPAGATION_NEVER: 非トランザクションで実行します。現在のトランザクションが存在する場合、例外がスローされます。

⑦ PROPAGATION_NESTED: 現在のトランザクションが存在する場合、ネストされたトランザクションで実行されます。現在トランザクションが存在しない場合は、REQUIRED 属性に従って実行します。

Spring トランザクション分離について話しますか?

Spring には 5 つの分離レベルがあり、デフォルト値は ISOLATION_DEFAULT (データベース設定を使用) で、他の 4 つの分離レベルはデータベース分離レベルと一致します。

\1. ISOLATION_DEFAULT: 基礎となるデータベースを使用して分離レベルを設定します。データベースに設定されているものはすべて使用します。

\2. ISOLATION_READ_UNCOMMITTED: 非コミット読み取り、最も低い分離レベル、トランザクションがコミットされる前は、他のトランザクションによって読み取ることができます (ファントム読み取り、ダーティー読み取り、非反復読み取りが発生します); 3. ISOLATION_READ_COMMITTED: コミットされた読み取り、トランザクションのコミット後コミットされたトランザクションは他のトランザクションによって読み取られることができます (ファントム読み取り、反復不能読み取りが発生します)。これは SQL サーバーのデフォルト レベルです。

\4. ISOLATION_REPEATABLE_READ: 繰り返し読み取り。同じデータが複数回読み取られたときに、その値がトランザクションの開始時の内容と一致していることを保証し、他のトランザクションによって送信されていないデータの読み取りを禁止します (ファントム読み取りが発生します)、MySQL のデフォルト レベル

\5. ISOLATION_SERIALIZABLE: シリアル化。最も高価で信頼性の高い分離レベルであり、ダーティ リード、反復不可能な読み取り、ファントム リードを防止できます。

ダーティ リード: トランザクションが別のトランザクションのコミットされていないデータを読み取ることができることを示します。たとえば、トランザクションがレコード A を挿入しようとしましたが、その時点ではトランザクションはコミットされていないため、別のトランザクションがレコード A を読み取ろうとしたとします。

非反復読み取り: トランザクション内で同じデータを複数回読み取ることを指します。

ファントム リーディング: 同じトランザクション内の複数のクエリによって返される結果セットが異なるという事実を指します。たとえば、同じトランザクション A の最初のクエリには n 個のレコードがありますが、同じ条件の 2 番目のクエリには n+1 個のレコードがありますが、これは錯覚であると思われます。ファントム読み取りの理由は、別のトランザクションが最初のトランザクションの結果セット内のデータを追加、削除、または変更するためであり、同じレコードのデータ内容が変更されると、すべてのデータ行のレコードが増加または減少します。

Spring フレームワークでのトランザクション管理の利点は何ですか?

  • JTA、JDBC、Hibernate、JPA、JDO などのさまざまなトランザクション API に不変のプログラミング モデルを提供します。
  • 複雑なトランザクション API の代わりに、プログラムによるトランザクション管理のための単純な API のセットを提供し、宣言型トランザクション管理をサポートします。
  • Spring のさまざまなデータ アクセス抽象化レイヤーと適切に統合されています。

どのタイプのトランザクション管理を好みますか?

Spring フレームワークのほとんどのユーザーは、宣言型トランザクション管理を選択します。これは、アプリケーション コードへの影響が最小限であり、非侵入型の軽量コンテナの考え方により近いためです。宣言型トランザクション管理は、プログラムによるトランザクション管理よりも優れていますが、プログラムによるトランザクション管理 (コードを通じてトランザクションを制御できる) よりも柔軟性が若干劣ります。唯一の欠点は、最も細かい粒度はメソッド レベルにのみ適用でき、プログラム トランザクションのようなコード ブロック レベルには適用できないことです。

Spring アスペクト指向プログラミング (AOP) (13) AOP とは

OOP (オブジェクト指向プログラミング) オブジェクト指向プログラミングでは、開発者は垂直方向の関係を定義できますが、水平方向の関係を定義するのには適していないため、コードの重複が多くなり、さまざまなモジュールの再利用に役立ちません。

一般にアスペクト指向プログラミングとして知られる AOP (アスペクト指向プログラミング) は、オブジェクト指向の補足として、ビジネスとは関係がないが複数のオブジェクトに影響を与えるパブリックな動作とロジックを 1 つの再利用可能なモジュールに抽出してカプセル化するために使用されます。 , このモジュールは「Aspect」と名付けられており、システム内のコードの重複を減らし、モジュール間の結合を減らし、システムの保守性を向上させます。権限認証、ロギング、トランザクション処理などに利用できます。

Spring AOP と AspectJ AOP の違いは何ですか? AOP の実装は何ですか?

AOP 実装の鍵はプロキシ モードにあり、AOP プロキシは主に静的プロキシと動的プロキシに分けられます。静的プロキシは AspectJ で表され、動的プロキシは Spring AOP で表されます。

(1) AspectJ は静的プロキシの拡張版です。いわゆる静的プロキシとは、AOP フレームワークがコンパイル フェーズ中に AOP プロキシ クラスを生成することを意味するため、コンパイル時拡張とも呼ばれます。AspectJ (アスペクト) を織り込みます。コンパイル段階での Java バイト。コードでは、実行中の拡張 AOP オブジェクトです。

(2) Spring AOP で使用される動的プロキシ いわゆる動的プロキシとは、AOP フレームワークがバイトコードを変更せず、実行するたびにメソッドの AOP オブジェクトをメモリ内に一時的に生成することを意味します。

オブジェクトにはターゲット オブジェクトのすべてのメソッドが含まれており、特定のカット ポイントで拡張され、元のオブジェクトのメソッドがコールバックされます。

JDKダイナミックプロキシとCGLIBダイナミックプロキシの違い

Spring AOP の動的プロキシには、JDK 動的プロキシと CGLIB 動的プロキシという 2 つの主な方法があります。

  • JDK 動的プロキシはインターフェイスのプロキシのみを提供し、クラスのプロキシはサポートしません。コアの InvocationHandler インターフェイスと Proxy クラスである InvocationHandler は、invoke() メソッドのリフレクションを通じてターゲット クラスのコードを呼び出し、横断的なロジックとビジネスを動的に組み合わせます。次に、Proxy は InvocationHandler を使用して、準拠するインスタンスを動的に作成します。特定のインターフェースに対して、対象クラスのプロキシオブジェクトを生成します。
  • プロキシ クラスが InvocationHandler インターフェイスを実装していない場合、Spring AOP は CGLIB を使用してターゲット クラスを動的にプロキシすることを選択します。CGLIB (Code Generation Library) はコード生成用のクラス ライブラリであり、実行時に指定されたクラスのサブクラス オブジェクトを動的に生成し、特定のメソッドをオーバーライドして拡張コードを追加して AOP を実現できます。CGLIB は継承による動的プロキシであるため、クラスが Final としてマークされている場合、CGLIB を動的プロキシとして使用することはできません。

静的プロキシと動的プロキシの違いは、AOP プロキシ オブジェクトを生成するタイミングが異なることです。相対的に言えば、AspectJ の静的プロキシ方式の方がパフォーマンスが優れていますが、AspectJ は処理に特定のコンパイラを必要とします。

Spring AOP は特定のコンパイラ処理を必要としません。

InvocationHandler の invoke(Object proxy,Method メソッド,Object[] args):

proxy は、最後に生成されたプロキシ インスタンスです。method は、プロキシ ターゲット インスタンスの特定のメソッドです。args は、メソッド リフレクションが呼び出されるときに使用される、プロキシ ターゲット インスタンスのメソッドの特定の入力パラメータです。

Spring のプロキシを理解するにはどうすればよいですか?

対象オブジェクトにアドバイスを適用した後に作成されるオブジェクトをプロキシと呼びます。クライアント オブジェクトの場合、ターゲット オブジェクトとプロキシ オブジェクトは同じです。

アドバイス + ターゲット オブジェクト = プロキシ

Spring AOP のいくつかの名詞を説明する

(1) アスペクト: アスペクトは、アドバイスとポイントカットの組み合わせです。アドバイスとポイントカットは一緒になって、アスペクトの全体的な内容を定義します。Spring AOP では、アスペクトはジェネリック クラス (パターンベースのスタイル) を使用して実装することも、@AspectJ アノテーションが付けられた通常のクラスで実装することもできます。

(2) ジョインポイント: メソッドを指します。Spring AOP では、ジョインポイントは常にメソッドの実行を表します。アプリには、不定期に何千ものアプリ通知が送信される場合があります。これらの機会は結合ポイントと呼ばれます。ジョインポイントは、アプリケーションの実行中にアスペクトを挿入できるポイントです。この時点は、メソッドが呼び出されたとき、例外がスローされたとき、さらにはフィールドが変更されたときである可能性があります。アスペクト コードは、これらのポイントを使用してアプリケーションの通常のフローに挿入し、新しい動作を追加できます。

(3) アドバイス (Advice): AOP 用語では、アスペクトの作業をアドバイスと呼びます。

(4) ポイントカット: ポイントカットの定義は、アドバイスが組み込まれる 1 つ以上の結合ポイントと一致します。通常、これらのポイントカットは、明示的なクラス名とメソッド名を使用するか、正規表現を使用して一致するクラス名とメソッド名を定義することによって指定します。

(5) 導入: 導入により、既存のクラスに新しいメソッドまたはプロパティを追加できます。

(6) 対象オブジェクト: 1 つ以上のアスペクトによって通知される

(アドバイス)オブジェクト。通常、これはプロキシ オブジェクトです。通知されるとも言います

(アドバイスされた)オブジェクト。Spring AOP はランタイム プロキシを通じて実装されるため、このオブジェクトは常にプロキシされたオブジェクトになります。

(7) ウィービング: ウィービングは、ターゲット オブジェクトにアスペクトを適用し、新しいプロキシ オブジェクトを作成するプロセスです。ターゲット オブジェクトのライフ サイクルの何ポイントをウィービングできるか:

  • コンパイル時: ターゲット クラスのコンパイル時にアスペクトが組み込まれます。AspectJ のウィービング コンパイラーは、この方法でアスペクトをウィービングします。
  • クラスのロード期間: アスペクトは、ターゲット クラスが JVM にロードされるときに織り込まれます。ターゲット クラスをアプリケーションに取り込む前にそのバイトコードを拡張する特別なクラス ローダーが必要です。AspectJ5 のロード時ウィービングは、この方法でアスペクトのウィービングをサポートします。
  • 実行時: アスペクトはアプリケーション実行中のある時点で組み込まれます。一般に、アスペクトをウィービングするとき、AOP コンテナはターゲット オブジェクトのプロキシ オブジェクトを動的に作成します。Spring AOP はこのようにしてアスペクトを織り込みます。

Spring は実行時にオブジェクトに通知します

アスペクトをプロキシ クラスでラップすることにより、Spring は実行時にアスペクトを Spring 管理の Bean に織り込みます

真ん中。プロキシはターゲット クラスをカプセル化し、推奨されたメソッドの呼び出しをインターセプトし、その呼び出しを実際のターゲット Bean に転送します。プロキシがメソッド呼び出しをインターセプトすると、ターゲット Bean メソッドを呼び出す前にアスペクト ロジックが実行されます。

Spring は、アプリケーションがプロキシ Bean を必要とするまで、プロキシ オブジェクトを作成しません。使用している場合

ApplicationContext の場合、ApplicationContext が BeanFactory からすべての Bean をロードするときに、Spring はプロキシされたオブジェクトを作成します。プロキシ オブジェクトは実行時に作成されるため、Spring AOP の側面を織り込むために特別なコンパイラは必要ありません。

Spring はメソッドレベルのジョインポイントのみをサポートします

Spring は動的プロキシに基づいているため、Spring はメソッド結合ポイントのみをサポートします。Spring に不足しているフィールドは、Aspect によって補うことができます。

結合ポイントはサポートされますが、コンストラクターの結合ポイントはサポートされません。メソッド外の接続ポイントインターセプト機能、Spring AOP の懸念と横断的懸念の違いは何ですか? Spring AOP における懸念と横断的懸念の違い

懸念事項はアプリケーション内のモジュールの動作であり、懸念事項は達成したい機能として定義される場合があります。

横断的な懸念事項は、アプリケーション全体で使用され、ロギング、セキュリティ、データ転送など、アプリケーションのほぼすべてのモジュールで必要な機能など、アプリケーション全体に影響を与える懸念事項です。したがって、これらは横断的な懸念事項です。

春のアドバイスにはどのような種類がありますか?

AOP 用語では、アスペクトの作業はアドバイスと呼ばれ、プログラムの実行時に実際に渡されます。

Spring AOP フレームワークによってトリガーされるコード スニペット。

Spring アスペクトでは 5 種類のアドバイスを適用できます。

\1. 事前通知 (Before): ターゲット メソッドが呼び出される前に通知関数を呼び出します。

\2. 通知後 (後): ターゲット メソッドが完了した後に通知を呼び出します。この時点ではメソッドの出力は気にしません。

\3. 通知を返す (戻り後): ターゲット メソッドが正常に実行された後に通知を呼び出します。

\4. スロー後: ターゲット メソッドが例外をスローした後に通知を呼び出します。

\5. 通知の周囲 (Around): 通知は通知されたメソッドをラップし、通知されたメソッドの呼び出しの前後にカスタム動作を実行します。

同じ側​​面で、異なるアドバイスの実行順序は次のとおりです。

① 例外がない場合の実行シーケンス:

前後 アドバイス前 アドバイス前 目標方法 执行 前後 アドバイス後 アドバイス

帰国後

②例外時の実行順序:アドバイス前頃 アドバイス前 ターゲットメソッド実行頃 アドバイス後 アドバイス後

afterThrowing: 例外が発生しました java.lang.RuntimeException: 例外が発生しました

アスペクトアスペクトとは何ですか?

アスペクトはポイントカウントとアドバイスで構成され、アスペクトはアドバイスとポイントカットの組み合わせです。これには、横断的なロジックの定義と接続ポイントの定義の両方が含まれており、Spring AOP はアスペクトの実装を担当するフレームワークであり、アスペクトによって定義された横断的なロジックを、アスペクトによって指定された接続ポイントに織り込みます。

AOP の作業の焦点は、ウィービング ターゲット オブジェクトの接続ポイントを強化する方法であり、これには 2 つのタスクが含まれます。

  • ポイントカットとアドバイスを通じて特定のジョインポイントを見つける方法
  • アドバイスにおけるアスペクトコードの書き方。

@Aspect アノテーションが付けられたクラスは単純にアスペクトであると考えることができます。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-LVHUYORZ-1692509211713) (06-春の面接の質問 (2020 最新版)-focus .assets/Aspect Notes.png )]

XML スキーマに基づいたアスペクトの実装について説明する

この場合、アスペクトは通常のクラスと XML ベースの構成によって実装されます。アノテーションベースのアスペクト実装について説明する

この場合 (@AspectJ の実装に基づく)、関連するアスペクト宣言のスタイルは、java5 アノテーションを持つ通常の Java クラスと一致します。

自動プロキシには何種類ありますか?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

同じ側​​面で、異なるアドバイスの実行順序は次のとおりです。

① 例外がない場合の実行シーケンス:

前後 アドバイス前 アドバイス前 目標方法 执行 前後 アドバイス後 アドバイス

帰国後

②例外時の実行順序:アドバイス前頃 アドバイス前 ターゲットメソッド実行頃 アドバイス後 アドバイス後

afterThrowing: 例外が発生しました java.lang.RuntimeException: 例外が発生しました

アスペクトアスペクトとは何ですか?

アスペクトはポイントカウントとアドバイスで構成され、アスペクトはアドバイスとポイントカットの組み合わせです。これには、横断的なロジックの定義と接続ポイントの定義の両方が含まれており、Spring AOP はアスペクトの実装を担当するフレームワークであり、アスペクトによって定義された横断的なロジックを、アスペクトによって指定された接続ポイントに織り込みます。

AOP の作業の焦点は、ウィービング ターゲット オブジェクトの接続ポイントを強化する方法であり、これには 2 つのタスクが含まれます。

  • ポイントカットとアドバイスを通じて特定のジョインポイントを見つける方法
  • アドバイスにおけるアスペクトコードの書き方。

@Aspect アノテーションが付けられたクラスは単純にアスペクトであると考えることができます。

[外部リンク画像転送...(img-LVHUYORZ-1692509211713)]

XML スキーマに基づいたアスペクトの実装について説明する

この場合、アスペクトは通常のクラスと XML ベースの構成によって実装されます。アノテーションベースのアスペクト実装について説明する

この場合 (@AspectJ の実装に基づく)、関連するアスペクト宣言のスタイルは、java5 アノテーションを持つ通常の Java クラスと一致します。

自動プロキシには何種類ありますか?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

メタデータの自動プロキシ

おすすめ

転載: blog.csdn.net/leader_song/article/details/132391123