06春の原理説明
1. Springフレームワークとは何ですか?Springフレームワークに含まれるモジュールはどれですか
Springはオープンソースフレームワークであり、Springは軽量のJava開発フレームワークです。これは、エンタープライズアプリケーション開発の複雑さを解決するために作成されました。フレームワークの主な利点の1つは、J2EEアプリケーション開発用の統合フレームワークを提供しながら、ユーザーが使用するコンポーネントを選択できる階層化アーキテクチャです。Springは、基本的なJavaBeansを使用して、以前はEJBでしか実行できなかったことを実行します。ただし、Springの使用はサーバー側の開発に限定されません。単純さ、テスト容易性、疎結合の観点から、どのJavaアプリケーションもSpringの恩恵を受けることができます。Springの中核は、制御の反転(IoC)とアスペクト指向(AOP)です。簡単に言えば、Springは階層的なフルスタック(ワンストップ)の軽量オープンソースフレームワークです。
主に含まれるモジュール:
2. SpringFrameworkの利点
1. Springは、DI、AOP、およびボイラープレートコードの排除を通じて、エンタープライズレベルのJava開発を簡素化します
2. Springフレームワークに加えて、コアフレームワーク上に構築された巨大なエコシステムがあり、SpringをWebサービス、REST、モバイル開発、NoSQLなどのさまざまな分野に拡張します。
3.侵入の少ない設計、コードの汚染が非常に少ない
4.さまざまなアプリケーションサーバーに依存せずに、Springフレームワークに基づくアプリケーションは、Write Once、RunAnywhereの約束を真に実現できます。
5. SpringのIoCコンテナは、ビジネスオブジェクトの置き換えの複雑さを軽減し、コンポーネント間の分離を改善します
6. SpringのAOPを使用すると、セキュリティ、トランザクション、ログなどの一般的なタスクを一元的に処理できるため、再利用が向上します。
7. SpringのORMとDAOは、サードパーティの永続性レイヤーフレームワークとの良好な統合を提供し、基盤となるデータベースアクセスを簡素化します
8. Springの高度なオープン性により、アプリケーションがSpringに完全に依存する必要はありません。開発者はSpringフレームワークの一部または全部を自由に選択できます。
3. IOCとDIとは何ですか?
制御の反転とは、アプリケーション自体が依存オブジェクトの作成と保守に責任を負わないことを意味します。依存オブジェクトの作成と保守は外部コンテナの責任です。このようにして、アプリケーションは制御を外部コンテナに移し、制御の反転は制御の反転です。
依存性注入とは、プログラムの実行中に、外部コンテナが依存オブジェクトをコンポーネントに動的に注入することを指します。たとえば、通常、コンストラクター注入またはセッター注入を使用します。
4. SpringIOCコンテナの初期化プロセスを説明します
Spring IOCコンテナの初期化は、単純に3つのプロセスに分けることができます。
最初のプロセスは、リソースリソースの配置です。このソースは、BeanDefinitionのリソースの場所を参照します。このプロセスは、バケツの中の水が最初に水を見つける必要があるのと同じように、コンテナがデータを見つけるプロセスです。
2番目のプロセスはBeanDefinitionのロードプロセスです。このロードプロセスは、ユーザー定義のBeanをIocコンテナー内のデータ構造として表し、コンテナー内のデータ構造はBeanDefitionです。
3番目のプロセスは、これらのBeanDefinitionsをIOCコンテナに登録するプロセスです。このプロセスは、前のBeanDefitionをHashMapに保存するプロセスです。
5. BeanFactoryとFactoryBeanの違いは何ですか?
-
使用するシーン:
- IocコンテナからBean(byNameまたはbyType)を取得します
- 指定されたBeanがIocコンテナに含まれているかどうかを取得します
- Beanがシングルトンであるかどうかを判別する
-
FactoryBeanはBeanです。このBeanは単純なBeanではなく、オブジェクトを生成または変更できるファクトリBeanです。その実装は、デザインパターンのファクトリパターンおよびデコレータパターンに似ています。
使用するシーン
- ProxyFactoryBean
6、BeanFactoryとApplicationContextの類似点と相違点
同じ:
- Springは2つの異なるIOCコンテナを提供します。1つはBeanFactoryで、もう1つはApplicationContextで、どちらもJavaインターフェイスです。ApplicationContextはBeanFactoryから継承します(ApplicationContextはListableBeanFactoryから継承します。
- これらはすべて、XML属性を構成するために使用でき、属性の自動挿入もサポートします。
- ListableBeanFactoryはBeanFactoryを継承しますが、BeanFactoryとApplicationContextはどちらも、getBean( "bean name")を使用してBeanを取得する方法を提供します。
異なる:
- getBean()メソッドを呼び出すと、BeanFactoryはBeanをインスタンス化するだけであり、ApplicationContextは、コンテナーの開始時にシングルトンBeanをインスタンス化し、getBean()メソッドが再度インスタンス化されるのを待ちません。
- BeanFactoryは国際化i18nをサポートしていませんが、ApplicationContextはそれをサポートしています。
- BeanFactoryとApplicationContextのもう1つの違いは、リスナーとして登録されているBeanにイベントを公開する機能です。
- BeanFactoryのコア実装はXMLBeanFactoryであり、ApplicationContextのコア実装はClassPathXmlApplicationContextです。Webコンテナの環境では、WebApplicationContextを使用し、getServletContextメソッドを追加します。
- 自動インジェクションを使用してBeanFactoryを使用する場合は、APIを使用してAutoWiredBeanPostProcessorを登録する必要があります。ApplicationContextを使用する場合は、構成にXMLを使用できます。
- つまり、BeanFactoryは基本的なIOCおよびDI関数を提供し、ApplicationContextは高度な関数を提供します。BeanFactoryはテストおよび非実稼働での使用に使用できますが、ApplicationContextはより機能豊富なコンテナー実装であり、BeanFactoryよりも優れているはずです。
7. Spring Beanのライフサイクルは何ですか?
総括する:
(1)Beanのインスタンス化:
BeanFactoryコンテナーの場合、クライアントがコンテナーに初期化されていないBeanを要求するか、Beanの初期化時に別の初期化されていない依存関係を注入する必要がある場合、コンテナーはインスタンス化のためにcreateBeanを呼び出します。ApplicationContextコンテナーの場合、コンテナーが開始されると、BeanDefinitionオブジェクトの情報を取得することによってすべてのBeanがインスタンス化されます。
(2)オブジェクトプロパティの設定(依存性注入):
インスタンス化されたオブジェクトはBeanWrapperオブジェクトにカプセル化され、SpringはBeanDefinitionの情報とBeanWrapperによって提供される属性設定インターフェースに基づいて依存性注入を完了します。
(3)処理対応インターフェース:
次に、Springは、オブジェクトがxxxAwareインターフェースを実装しているかどうかを検出し、関連するxxxAwareインスタンスをBeanに挿入します。
①このBeanがBeanNameAwareインターフェースを実装している場合、それによって実装されたsetBeanName(String beanId)メソッドが呼び出され、ここに渡されるのはSpring構成ファイル内のBeanのID値です。
②このBeanがBeanFactoryAwareインターフェースを実装している場合、それによって実装されたsetBeanFactory()メソッドが呼び出され、Springファクトリ自体を渡します。
③このBeanがApplicationContextAwareインターフェースを実装している場合、setApplicationContext(ApplicationContext)メソッドを呼び出し、Springコンテキストを渡します。
(4)BeanPostProcessor:
Beanでカスタム処理を実行する場合は、BeanにBeanPostProcessorインターフェースを実装させることができます。このインターフェースは、postProcessBeforeInitialization(Object obj、String s)メソッドを呼び出します。
(5)InitializingBean与init-method:
BeanがSpring構成ファイルのinit-method属性で構成されている場合、構成された初期化メソッドが自動的に呼び出されます。
(6)BeanがBeanPostProcessorインターフェースを実装している場合、 postProcessAfterInitialization(Object obj、String s)メソッドが呼び出されます。このメソッドはBeanの初期化の最後に呼び出されるため、メモリまたはキャッシングテクノロジに適用できます。
上記の手順が完了すると、Beanが正しく作成され、Beanを使用できるようになります。
(7)DisposableBean:
Beanが不要になると、クリーニングフェーズが実行されます。BeanがDisposableBeanインターフェースを実装している場合は、実装されているdestroy()メソッドを呼び出します。
(8)破壊方法:
最後に、destroy-method属性がこのBeanのSpring構成で構成されている場合、構成されたdestroyメソッドが自動的に呼び出されます。
8. Spring AOPの実現原理は?
Spring AOPで使用される動的プロキシ。いわゆる動的プロキシとは、AOPフレームワークがバイトコードを変更せず、メモリ内のメソッドのAOPオブジェクトを一時的に生成することを意味します。このAOPオブジェクトには、ターゲットオブジェクトのすべてのメソッドが含まれています。特定のポイントカットが強化され、元のオブジェクトのメソッドがコールバックされます。
Spring AOPの動的プロキシには、JDK動的プロキシとCGLIB動的プロキシの2つの主な方法があります。JDK動的プロキシは、リフレクションを介してプロキシクラスを受け取り、インターフェイスを実装するためにプロキシクラスを必要とします。JDK動的プロキシのコアは、InvocationHandlerインターフェースとProxyクラスです。
ターゲットクラスがインターフェイスを実装していない場合、SpringAOPはCGLIBを使用してターゲットクラスを動的にプロキシすることを選択します。CGLIB(コード生成ライブラリ)は、実行時に特定のクラスのサブクラスを動的に生成できるコード生成クラスライブラリです。CGLIBは継承による動的プロキシであるため、クラスがfinalとしてマークされている場合、CGLIBを次のように使用することはできません。動的プロキシ。
9. Springはどのように業務を管理しますか?
Springトランザクション管理には主に3つのインターフェースが含まれ、Springトランザクションは主に3つのインターフェース(PlatformTransactionManager、TransactionDefinition、TransactionStatus)によって完了します。
1. PlatformTransactionManager:トランザクションマネージャー-主にプラットフォーム関連のトランザクションの管理に使用されます
3つの主な方法があります:
- トランザクションのコミットをコミットします。
- ロールバックトランザクションロールバック。
- getTransactionトランザクションステータスを取得します。
2. TransactionDefinition:トランザクション定義情報-トランザクション関連の属性を定義するために使用され、トランザクションマネージャーPlatformTransactionManagerによって使用されます
このインターフェースには、次の4つの主要な方法があります。
- getIsolationLevel:分離レベルを取得します。
- getPropagationBehavior:伝播動作を取得します。
- getTimeout:タイムアウト時間を取得します。
- isReadOnly:読み取り専用かどうか(保存、更新、削除の場合は属性がfalseになり、読み取りと書き込み、照会の場合はtrueになります)読み取り専用)
トランザクションマネージャはこの戻り値に従って最適化でき、これらのトランザクションの構成情報は構成ファイルを介して構成できます。
3. TransactionStatus:トランザクションの特定の動作ステータス-トランザクション管理プロセスの各ポイントでのトランザクションのステータス情報。
たとえば、そのいくつかの方法:
- hasSavepoint():このトランザクションにセーブポイントが含まれているかどうかを返します。
- isCompleted():トランザクションが完了したかどうか、つまり、トランザクションがコミットされたかロールバックされたかを返します。
- isNewTransaction():現在のトランザクションが新しいトランザクションであるかどうかを判別します
宣言型トランザクションの長所と短所:
- 利点:ビジネスロジックコードにトランザクション関連のコードを記述する必要はありません。構成ファイルで注釈(@Transaction)を構成または使用するだけで、邪魔になりません。
- 短所:最もきめ細かい宣言型トランザクションがメソッドに作用します。コードブロックのようなトランザクション要件がある場合は、それを回避してコードブロックをメソッドに変換することしかできません。
10. Springのさまざまなトランザクション伝播動作とは何ですか?また、それらは何に使用されますか?
11. Springではどのようなデザインパターンが使用されていますか?
- プロキシモード-AOPでより多く使用されます。
- シングルトンモード-スプリング構成ファイルで定義されたBeanは、デフォルトでシングルトンモードになります。
- テンプレートメソッド-コードの重複の問題を解決するために使用されます。例:RestTemplate、JmsTemplate、JpaTemplate。
- ファクトリパターン-BeanFactoryは、オブジェクトのインスタンスを作成するために使用されます。
- アダプター-スプリングaop
- デコレータ-春のデータハッシュマッパー
- オブザーバー-春のイベント駆動型モデル
- コールバック--SpringAwareコールバックインターフェイス
12. Springは循環依存関係をどのように解決しますか?
https://blog.csdn.net/qq_36381855/article/details/79752689
13、Beanのスコープ
(1)シングルトン:デフォルトでは、各コンテナーにはBeanインスタンスが1つだけあり、シングルトンモードはBeanFactory自体によって維持されます。
(2)プロトタイプ:各Beanリクエストのインスタンスを提供します。
(3)リクエスト:ネットワークリクエストごとにインスタンスを作成します。リクエストが完了すると、Beanは無効になり、ガベージコレクターによってリサイクルされます。
(4)セッション:リクエストスコープと同様に、各セッションにBeanのインスタンスがあることを確認します。セッションの有効期限が切れると、Beanは無効になります。
14.Springフレームワークのさまざまなタイプのイベントは何ですか
(1)コンテキスト更新イベント(ContextRefreshedEvent):ConfigurableApplicationContextインターフェイスのrefresh()メソッドが呼び出されたときにトリガーされます。
(2)ContextStartedEvent:このイベントは、コンテナーがConfigurableApplicationContextのStart()メソッドを呼び出してコンテナーを開始/再起動したときにトリガーされます。
(3)コンテキスト停止イベント(ContextStoppedEvent):このイベントは、コンテナーがConfigurableApplicationContextのStop()メソッドを呼び出してコンテナーを停止したときにトリガーされます。
(4)ContextClosedEvent:このイベントは、ApplicationContextが閉じられたときにトリガーされます。コンテナが閉じられると、コンテナによって管理されているすべてのシングルトンBeanが破棄されます。
(5)RequestHandledEvent:Webアプリケーションでは、このイベントはhttpリクエスト(リクエスト)が終了したときにトリガーされます。
15.春の通知の種類は何ですか
(1)アドバイス前:ジョインポイントの前に実行される通知ですが、この通知は、(例外をスローしない限り)ジョインポイントの前の実行を防ぐことはできません。
(2)アドバイスを返した後:ジョインポイントが正常に完了した後に実行される通知:たとえば、メソッドは例外をスローせず、正常に戻ります。
(3)アドバイスをスローした後:例外をスローしてメソッドが終了したときに実行されるアドバイス。
(4)(最終的に)アドバイス後:接続ポイントが終了したときに実行される通知(正常な復帰か異常な終了かに関係なく)。
(5)アラウンドアドバイス:メソッド呼び出しなど、ジョインポイントを取り巻くアドバイス。これは最も強力なタイプの通知です。サラウンド通知は、メソッドが呼び出される前後にカスタム動作を完了することができます。また、接続ポイントの実行を続行するか、独自の戻り値を直接返すか、例外をスローして実行を終了するかを選択します。サラウンド通知は、最も一般的に使用されるタイプの通知です。
16、スプリングの自動組立
春には、オブジェクトはそれ自体に関連付けられた他のオブジェクトを検索または作成する必要はありません。コンテナは、各オブジェクトと連携する必要のあるオブジェクト参照を割り当てる責任があり、autowireを使用して自動ロードモードを構成します。
Spring Frameworkのxml構成には、次の5種類の自動アセンブリがあります。
(1)いいえ:デフォルトの方法は自動アセンブリを実行せず、Beanはref属性を手動で設定することによってアセンブルされます。
(2)byName:自動アセンブリはBeanの名前で実行されます。あるBeanのプロパティが別のBeanの名前と同じである場合、自動アセンブリが実行されます。
(3)byType:パラメータのデータ型による自動アセンブリ。
(4)コンストラクター:コンストラクターを使用してアセンブルし、コンストラクターのパラメーターはbyTypeを介してアセンブルされます。
(5)自動検出:自動検出。構築方法がある場合は、構築によって自動的にアセンブルされます。それ以外の場合は、byTypeによって自動的にアセンブルされます。
注釈ベースの方法:
@Autowiredアノテーションを使用して、指定したBeanを自動的にアセンブルします。@Autowiredアノテーションを使用する前に、Spring構成ファイル<context:annotation-config />でそれを構成する必要があります。Spring IoCが開始されると、コンテナはAutowiredAnnotationBeanPostProcessorポストプロセッサを自動的にロードします。コンテナが@ Autowied、@ Resource、または@Injectをスキャンすると、IoCコンテナで必要なBeanが自動的に検出され、オブジェクトのプロパティにアセンブルされます。@Autowiredを使用する場合は、最初にコンテナ内の対応するタイプのBeanをクエリします。
クエリ結果が1つだけの場合、Beanは@Autowiredで指定されたデータにアセンブルされます。
クエリの結果が複数ある場合、@ Autowiredは名前で検索します。
上記の検索結果が空の場合、例外がスローされます。解決するときは、required = falseを使用します。
@Autowiredは、コンストラクター、メンバー変数、セッターメソッドに使用できます。
注:@Autowiredと@Resourceの違い
(1)@Autowiredは、デフォルトで型アセンブリによって注入されます。デフォルトでは、依存オブジェクトが存在する必要があります(required属性をfalseに設定できます)。
(2)@Resourceは、デフォルトで名前に従ってインジェクションをアセンブルします。名前に一致するBeanが見つからない場合にのみ、インジェクションはタイプに従ってアセンブルされます。