「インタビュー全8回エッセイ」の春の第18弾 新しくリリースされました。今回は春に関するインタビューの質問を整理しました。また、春に関するインタビューの質問をネット上で調べてまとめました。 , 基本はすべてここにあります。もちろん、基本的すぎる概念もあるかもしれません。私はそれらを直接特定の質問にまとめたので、別の質問は開いていません。皆さんのスムーズな面接を祈っています~
1. Spring ではどのようなデザイン パターンが使用されますか?
2. コアとは何ですか?春のモジュール?
3. IOC について理解していることを教えてください?
4. 春の IOC コンテナとは何ですか?違いは何ですか?
5. BeanFactory と FactoryBean の違いは何ですか?
6. @Repository と @Service の違いは何ですか? 、@Compent、および @Controller?
7. DI とは何ですか?
8. AOP とは何ですか?
##9. 動的プロキシと静的プロキシの違いは何ですか?
10. JDK 動的プロキシと CGLIB プロキシの違いは何ですか?
11.Spring AOP と AspectJ AOP の違いは何ですか?
#12.Spring の Bean のライフサイクルとは何ですか?
#13.Spring は循環依存関係をどのように解決しますか?
14. なぜ 3 次キャッシュを使用するのでしょうか? 2 次キャッシュでは解決できないのでしょうか?
15. @Autowired と @ の違いは何ですか?リソース?
16. Spring のトランザクション分離レベルとは何ですか?
17. Spring トランザクションの伝播メカニズムとは何ですか?
18.springBoot 自動アセンブリ原理?
##
#1.春にはどのようなデザイン パターンが使用されますか?
『1.Factory 設計パターン』 : 例: BeanFactory と ApplicationContext による Bean オブジェクトの生成
『2.Agent 設計パターン』 : AOP実装方法はプロキシ経由で、Spring では主に JDK ダイナミックプロキシと CGLIB プロキシを使用します。
「3. シングルトン設計パターン」 : Spring の Bean デフォルトはシングルトン
#「4. テンプレートメソッドモード」: Spring では、jdbcTemplate や、データベース上で動作する Template で終わるその他のクラスは、テンプレートを使用します。 メソッド設計パターン、いくつかの共通関数
「5. ラッパー設計パターン」: 私たちのプロジェクトは複数のデータベースに接続する必要があり、異なる顧客が各データベースに接続する必要があります。必要に応じてデータベースにアクセスします。このモードを使用すると、顧客のニーズに応じて異なるデータ ソースを動的に切り替えることができます。
「6. オブザーバー モード」 : Spring イベント駆動型モデルのオブザーバー モード
#「7. アダプター モード」: Spring AOP の機能拡張または通知 (アドバイス) はアダプター モードを使用します
#2. Spring のコア モジュールとは何ですか?
1.「Spring Core」 : フレームワークの最も基本的な部分である Spring コアは、IOC および依存関係注入 DI 機能を提供します
2."Spring Context": Spring BeanFactory の機能が強化されたサブインターフェイスであるコンテキスト コンテナ
#3.「Spring Web」: Web アプリケーション開発のサポートを提供します
4.「Spring MVC」: MVC のアイデアを Web アプリケーションに実装することを目的としています
5. 「Spring DAO」: JDBC 抽象化レイヤーを提供し、JDBC コーディングを簡素化すると同時に、コーディングをより堅牢にします。 #6. 「Spring ORM」 : Spring Hibernate、Spring iBatis、Spring JDO 統合などの一般的な ORM フレームワークの統合をサポートします。7. 「Spring AOP」: アスペクト指向プログラミング。AOP Alliance と互換性のあるプログラミング実装を提供します。
3. どの IOC を理解しているのか教えてください。
まず第一に、IOC はオブジェクトをロードするために使用される "コンテナ" です。その中心的なアイデアは "制御の反転" です。 " それでは具体的には何ですか "制御の反転とは"
?制御の反転とは、 "オブジェクトの制御をスプリングとSpring コンテナで管理します
、操作は行いません
では、なぜ 「制御の反転が必要なものは何ですか」 ?
制御の反転がない場合、「オブジェクトを作成し、オブジェクトを自分で構成する必要がある」と想像してみましょう。 および 「オブジェクト間のさまざまな複雑な依存関係を手動で処理する」 では、プロジェクトがスケールアップすると、この関係を維持するのが非常に面倒になるため、制御の反転という概念があります。オブジェクトの作成や設定などの一連の操作を Spring に管理用に提供するもので、使用する場合はそれを取得するだけで済みます
4.Spring の IOC コンテナとは何ですか?違いは何ですか?
spring は主に "2 種類の IOC コンテナ" を提供します。1 つは "BeanFactory" " 、もう 1 つは "ApplicationContext"
両者の違いは、BeanFactory "オブジェクトのインスタンス化とオブジェクトの取得という最も基本的な機能のみを提供する" ことと、ApplicationContext は BeanFactory から派生した製品であることです。
5. BeanFactory と FactoryBean の違いは何ですか? #これら 2 つは 「別の製品」
「BeanFactory は IOC コンテナです」 はオブジェクトを運ぶために使用されます
# #"FactoryBean はインターフェイスです" これは、Bean により柔軟な方法を提供します。Bean オブジェクトをプロキシすることにより、メソッドは一部の操作の前後に処理できます。
6. @Repository、@Service、@Compent、および @Controller の違いは何ですか? これら 4 つのアノテーションの
「本質は同じです。アノテーションによって識別されるオブジェクトは、使用されているさまざまなアプリケーション層を区別するためだけに、スプリング コンテナーに配置されます。」
@Compent: 上記の 3 つのレイヤーに属さない他のコンポーネントは、この注釈
7 を使用します。ではDIとは何でしょうか?
#DIとは依存性注入のことで、実はIOCとほぼ同じなのですが、「同じ概念を別の角度から解説したもの」
DI の説明「依存関係に焦点を当てている」 と我々は述べました 「IOC の中核機能は、プログラムの実行中に他の依存オブジェクトをオブジェクトに動的に提供することです」, この機能は DI に依存することで実現されます。たとえば、オブジェクト A を注入する必要があり、このオブジェクト A がオブジェクト B に依存する場合、このオブジェクト B をオブジェクト A に注入する必要があります。これが依存関係注入です
spring には 3 つのインジェクション方法があります。
インターフェースインジェクション
コンストラクターインジェクション
set インジェクション
8. AOP とは何ですか?
AOP とは次のことを意味します: 「アスペクト指向」プログラミング、実行時のプリコンパイルと動的プロキシによりプログラム機能の一元的な保守を実現する技術".
AOP は 「OOP (オブジェクト指向プログラミング) の継続」 であり、Spring フレームワークの重要な内容であり、関数型プログラミングの派生パラダイムです。 AOP を使用すると、ビジネス ロジックのさまざまな部分を分離できるため、ビジネス ロジックのさまざまな部分間の結合が軽減され、プログラムの再利用性が向上し、開発効率が向上します。
「AOP 実装は主に 2 つのカテゴリに分類されます:」
「静的 AOP 実装」 、AOP フレームワーク「コンパイル段階」 プログラムのソース コードを変更します。 AspectJ
「動的 AOP 実装」などの静的 AOP プロキシ クラスが生成されます (生成された *.class ファイルは変更されており、特定のコンパイラを使用する必要があります)。 、AOP フレームワーク "実行時" SpringAOP # など、プロキシ オブジェクトを動的に生成する場合 (メモリ内の JDK 動的プロキシを使用するか、CGlib を使用して AOP プロキシ クラスを動的に生成する) #Spring の AOP の実装は 「動的プロキシを介して実装される」 です。インターフェースが実装されている場合は JDK 動的プロキシが使用され、それ以外の場合は CGLIB プロキシが使用されます。
#「通知の種類は 5 つあります:」
「@Before」
##「@AfterReturning」: 対象のメソッドが返されるか例外が発生した後に呼び出します #『@AfterThrowing』: ターゲット メソッドが返された後に呼び出されます。 #『@After』 : ターゲット メソッドの例外の後に呼び出されます #『@Around』 : 対象のメソッドをカプセル化し、呼び出し時間を自分で決定する 9. 動的プロキシと静的プロキシの違いは何ですか?
「静的プロキシ」
プログラマによって作成されるか、特定のツールによって自動的に生成され、コンパイルされます。プログラムが実行される前に、プロキシ クラスの .class ファイルはすでに存在します。
静的プロキシは通常、1 つのクラスのみをプロキシします。
静的プロキシは、それを認識します。事前にプロキシするもの
「動的プロキシ」
プログラムの実行時に、プロキシは次を使用して動的に作成されます。 Cheng
動的プロキシは、インターフェイス下の複数の実装クラスのプロキシです
動的プロキシは、何をプロキシするのかを知りません。実行時のみ そのとき初めて知りました
10. JDK ダイナミック プロキシと CGLIB プロキシの違いは何ですか?
JDK 動的プロキシ ビジネス クラス 「特定のインターフェイスを実装する必要がある」 (これは 「リフレクション メカニズムに基づいて実装される」
であり、実装 A を生成します)同じインターフェイスのプロキシ クラスを使用し、メソッドをオーバーライドしてコードを拡張します。 CGLIB ダイナミック プロキシは、バイトコード処理フレームワーク ASM を使用します。その原理は、バイトコード テクノロジを使用して「クラスのサブクラスを作成し、親クラスのメソッドをオーバーライドする」ことです。 コード。
11.Spring AOP と AspectJ AOP の違いは何ですか?
Spring AOP は実行時の拡張機能であり、 「動的プロキシ実装」を通じて実装されます。
AspectJ AOP はコンパイル時の拡張機能であり、これには特別なコンパイラ。 「コードを修正」することで完成し、「3 つのウィービング方法」をサポートします。
「コンパイル時ウィービング」 : バイトコードのコンパイル時に、関連するプロキシ クラスをバイトコードに織り込みます。 # "コンパイル後のウィービング" : 初期クラスのコンパイル後、AOP 拡張が必要であることが判明し、関連するコードがそれに織り込まれます
: ローダーがクラスをロードするときのウィービング
を指します。
##主な違い
Spring AOP
AspecjtJ AOP
拡張方法
実行時の拡張 #コンパイル時の拡張
##実装方法
動的プロキシ
コードの変更
コンパイラ
javac
特別なコンパイラ ajc
効率
低い (実行時反射損失パフォーマンス)
高い
ウィービング方法
実行時
コンパイル時間、コンパイル後、クラスの読み込み時間
12. Spring の Bean のライフ サイクルとは何ですか?
SpringBean のライフ サイクルは、大きく 4 つの段階に分かれています。
1.「インスタンス化」、Bean オブジェクトをインスタンス化します
##2. 「属性の入力」
3.「初期化」
##Aware インターフェースが実装されている場合、コンテナー リソースはそのインターフェースを通じて取得されます。
BeanPostProcessor インターフェースが実装されている場合、このインターフェースの前処理および後処理の拡張機能が呼び出されます。 back
init-method メソッドが設定されている場合、] はこのメソッドを実行します
4. 「破壊」
DisposableBean インターフェイスが実装されている場合、インターフェイスの destroy メソッドがコールバックされます。
If destroy- Method メソッドが設定されている場合、destroy メソッドが実行されます -method 設定メソッド
13. Spring は循環依存関係をどのように解決しますか?
#循環依存関係とは、2 つのオブジェクトが相互に依存し、循環呼び出しリンクを形成することを意味します spring は、第 3 レベルのキャッシュを使用して循環リンクを解決します。中心となるロジックは、インスタンス化と初期化のステップを分離し、それらを別のオブジェクトが呼び出せるようにキャッシュに入れることです。
「一次キャッシュ」 : インスタンス化および初期化されたオブジェクトを保存するために使用されます。
「第 1 レベル キャッシュ」第 2 レベル キャッシュ" : インスタンス化されているが初期化されていないオブジェクトの保存に使用されます。
"第 3 レベル キャッシュ" : オブジェクトの保存に使用されます。ファクトリーは、2 番目のレベルのキャッシュにオブジェクトを作成するための匿名内部クラスを提供します
#クラス A と B の間で循環参照が発生した場合の一般的なプロセス
1.A インスタンス化が完了したら、「オブジェクト ファクトリを作成し、3 番目のレベルのキャッシュに置く」に進みます。
## A が AOP によってプロキシされている場合、このファクトリを通じて取得されるのは、A プロキシの後のオブジェクトです。
#A が AOP によってプロキシされていない場合、このファクトリによって取得されるのはインスタンス化ですA オブジェクトの
#2。A が属性注入を実行するときは、
## に進みます。 3. B は属性注入を実行し、A を必要とします。その後、「A ファクトリ プロキシ オブジェクトを 3 次レベル キャッシュから取得します」そしてそれを注入し、3 次キャッシュ内の A ファクトリを削除し、A を配置します。オブジェクトを第 2 レベルのキャッシュに移します
4.B 初期化が完了するまで後続の属性の注入を完了し、B を第 1 レベルのキャッシュに入れます ##5.「A from 一次キャッシュから B を取得し、B を注入」、後続の操作が完了するまで、A は二次キャッシュから削除され、一次キャッシュに配置されます
#spring には、循環依存関係を解決するための 2 つの前提条件があります。
1."すべてのコンストラクター メソッドではありません" 循環依存関係 (そうしないと、初期化操作とインスタンス化操作を分離できません)
2 .「シングルトンである必要があります」 (そうしないと、同じオブジェクトであることが保証されません)
14. なぜ使用するのかレベル 3 キャッシュ、2 レベル キャッシュでは解決できませんか?
はい、3 レベル キャッシュの機能は、循環依存関係が実際に発生する場合にのみ事前にプロキシ オブジェクトを生成し、それ以外の場合はプロキシ オブジェクトを生成することです。 「ファクトリを作成し、それを第 3 レベルのキャッシュに入れる」 だけですが、オブジェクトはこのファクトリを通じて実際に作成されるわけではありません。
第 2 レベルのキャッシュを使用して循環依存関係を解決する場合、すべての Bean がインスタンス化後に AOP プロキシを完了する必要があることを意味します。これは 「Spring 設計の原則に違反します」 、Spring は当初の設計 インスタンス化直後に AOP プロキシを実行するのではなく、Bean ライフサイクルの最後のステップで AOP プロキシを完了させることです。
15. @Autowired と @Resource の違いは何ですか?
「 @Resource これは Java 独自のアノテーションです。"
、@Resource には、name と type というより重要な 2 つの属性があります。Spring は @Resource アノテーションの name 属性を Bean の名前に解析し、type 属性は次のように解析します。豆の種類。したがって、name 属性が使用される場合は byName 自動挿入戦略が使用され、type 属性が使用される場合は byType 自動挿入戦略が使用されます。 name 属性も type 属性も指定されていない場合は、リフレクション メカニズムを通じて byName 自動挿入戦略が使用されます。
「@Autowired は spring のアノテーションです」、spring2.5 バージョンで導入されました。Autowired は型に基づいてのみ挿入します。 「名前が一致しません」
。型が挿入されたオブジェクトを識別できない場合は、 @Qualifier または @Primary アノテーションで修飾する必要があります。 ###
16. Spring のトランザクション分離レベルは何ですか?
DEFAULT: DB のデフォルトのトランザクション分離レベルを使用します
READ_UNCOMMITTED: コミットされていない読み取り
READ_COMMITTED: コミットされた読み取り
REPEATABLE_READ: 反復可能な読み取り
SERIALIZABLE: シリアル化
17 Spring トランザクションの伝播メカニズムとは何ですか?
##1.『propagation_required』 現在のメソッド「トランザクションのあるコンテキストで実行する必要があります」 、進行中のクライアント トランザクションがある場合、呼び出される側はトランザクション Run 内になります。それ以外の場合は、トランザクションを再開します。(呼び出される側で例外が発生した場合、呼び出し側と呼び出される側のトランザクションは両方ともロールバックされます)
現在のメソッドはトランザクション コンテキストを持つ必要はありませんが、トランザクション コンテキストがあればトランザクション内で実行できます
3.『propagation_mandatory』
現在のメソッド 「トランザクションで実行する必要がある」 ことを示します。トランザクションがない場合、例外がスローされます
# #現在のメソッドにトランザクションが実行中の場合、メソッドは 「ネストされたトランザクションで実行される」 必要があります。ネストされたトランザクションは、カプセル化されたトランザクションとは独立してコミットまたはロールバックできます。カプセル化されたトランザクションが存在し、外側のトランザクションがロールバック例外をスローした場合、内側のトランザクションはロールバックする必要がありますが、逆に、内側のトランザクションは外側のトランザクションには影響しません。カプセル化されたトランザクションが存在しない場合は、propagation_required
5.
# と同じになります。 ##現在のサービスはトランザクション内で実行しないでください。「トランザクションがある場合、例外がスローされます」
##6。 「propagation_requires_new」 現在のメソッド 「独自のトランザクションで実行する必要がある」。新しいトランザクションが開始され、既存のトランザクションが実行されている場合、新しいトランザクションがコミットまたはロールバックされるまで、このメソッドは実行中に一時停止されます。
7. 『propagation_not_supported』 メソッドはトランザクション内で実行しないでください。「トランザクションが実行中の場合、実行期間中は一時停止され、トランザクションがコミットまたはロールバックされるまで実行は再開されません。」
18. SpringBoot の自動アセンブリ原理?
1. コンテナーは、 EnableAutoConfigurationImportSelector.class の selectImports メソッドを呼び出します。 "一般的に使用される BeanConfiguration の包括的なリストを取得します。"
2. Spring-boot- は次のようになります。後で読む autoconfigure.jar の下の spring.factories、
"すべての Spring 関連 Bean の完全修飾名 ClassName を取得します"
3.次に、
#「フィルターを呼び出して 1 つずつフィルターする」 # に進み、必要のない、条件を満たさない Bean をフィルターで除外します。
4.最後に、修飾された BeanConfiguration は、プロパティ値をデフォルトの EnableConfigurationPropertie クラスに挿入し、 "それを IOC 環境に挿入します"
###
以上が『インタビュー八編エッセイ』春の巻18の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。