この記事は、JavaGuideの要約レビューに基づいています
SpringIOC / AOP
-
- Spring IOCとは何ですか?
- SpringIOC初期化プロセス
- Beanとは
- AOPとは何ですか、AOPの役割と実現
- SpringAOPとAspcetJAOPの違い
- SpringBeanのスコープ
- 春のシングルトンBeanのスレッドセーフ
- @Componentと@Beanの違いは何ですか?
- 豆のライフサイクル
- SpringMVCとは何ですか?
- SpringMVC実行プロセス
- Springで使用されるデザインパターン
- Springでトランザクションを管理する方法
- Springのトランザクション分離レベル
- Springでのトランザクションの伝播
- @Transactional(rollbackFor = Exception.class)アノテーションは理解できますか?
- JPAとは何ですか?
- JPAを使用して、データベース内のフィールドを非永続化します
Spring IOCとは何ですか?
IOCの制御の反転は、実際には、プログラム内で手動で作成されたオブジェクトの制御を管理するSpringフレームワークに転送する、デザインパターンの依存性逆転の概念の実現です。
依存性注入:最下位クラスをパラメーターとして上位クラスに渡し、上位クラスの「制御」を下位クラスに実現します。
ソースからの画像:インターネット
SpringIOC初期化プロセス
(1)最初ClassPathXmlApplicationContext
に提供されたリソースファイルパスを取得し、それを構成ファイル配列に処理します。
(2)Refresh
メソッドを呼び出してコンテナーを再構築します。Refresh
オリジナルはApplicationontext
破棄されます。
(3)Refresh
方法の場合:
- まず、Beanコンテナを作成する前に準備を行い、
prepareRefrash()
メソッドを呼び出します。起動時間を記録し、xmlファイルを確認します。 - **
obtainFreshBeanFactory()
メソッドを使用して、Beanコンテナーを作成し、Beanをロードして登録します。この方法ではだろう初始化BeanFactory
、加载Bean
、注册Bean
**のように。ただし、ここでBean实例
は作成されていません。
ApplicationContext
継承されますBeanFactory
、但是它不应该被理解为 BeanFactory 的实现类
、而是说其内部持有一个实例化的
たBeanFactoryDefaultListableBeanFactory
()。後続のすべてのBeanFactory関連の操作は、実際にDefaultListableBeanFactory
は処理のためにこのインスタンスに委任されます。
Beanとは
コードレベルからBeanDefinition
は、インターフェイスのインスタンスです。
AOPとは何ですか、AOPの役割と実現
AOPはアスペクト指向プログラミングの意味であり、ビジネスに関連していないがビジネスモジュールによって呼び出されるロジックと責任をカプセル化できます。(例:トランザクション処理、ログ管理、権限制御など)。コードの重複を減らし、モジュールの結合度を減らすと便利です。これは、スケーラビリティと保守性に役立ちます。
SpringAOPは動的プロキシに基づいています。
- インターフェイスが実装されている場合、SpringAOPはJDKプロキシを使用してプロキシオブジェクトを作成します。
- インターフェイスを実装するオブジェクトがない場合は、Cglibを使用して、プロキシオブジェクトのサブクラスをプロキシとして生成します。
- AspectJを使用することもできます。AspectJは、Javaエコシステムで最も完全なAOPフレームワークと見なす必要があります
SpringAOPとAspcetJAOPの違い
- Spring AOPは実行時の拡張機能であり、AspectJはコンパイル時の拡張機能です。
- Spring AOPはプロキシに基づいていますが、AspectJはバイトコード操作に基づいています。
- AspectJはSpringAOPに統合されています。多くの側面がある場合はAspectJをお勧めします。
SpringBeanのスコープ
- シングルトン:唯一のBeanインスタンスであり、SpringのBeanはデフォルトでシングルトンです。
- プロトタイプ:リクエストごとに新しいBeanインスタンスが作成されます。
- リクエスト:各HTTPリクエストは、現在のHTTPリクエストでのみ有効な新しいBeanを生成します。
- セッション:各HTTPリクエストは、現在のHTTPセッションでのみ有効な新しいBeanを生成します。
- global-session:グローバルセッションスコープ。ポートレットベースのWebアプリケーションでのみ意味があり、Spring5は廃止されました。
春のシングルトンBeanのスレッドセーフ
シングルトンBeanにはスレッドセーフの問題があります。複数のスレッドが同じオブジェクトの非静的メンバー変数を操作すると、スレッドセーフの問題が発生します。
解決策:ThreadLocalを使用してメンバー変数を定義します。
@Componentと@Beanの違いは何ですか?
- オブジェクトは異なります。@ Componentはクラスに作用し、@ Beanはメソッドに作用します。
- @ComponentScanと組み合わせた@Componentは、クラスをBeanコンテナーに簡単にアセンブルできます。
- @Beanアノテーションは通常、アノテーションでマークされたメソッドでこのBeanのインスタンスを定義することを意味します。@ Beanは、これが特定のクラスの例であり、必要なときに返されることをSpringに通知します。
- サードパーティのプラグインまたはライブラリをインポートする場合は、@ Beanを使用してSpringコンテナ管理をロードする必要がありますが、これは@componentでは実現できません。
豆のライフサイクル
SpringMVCとは何ですか?
MVCはデザインパターンであり、SpringMVCはSpringフレームワークによるMVCパターンのアプリケーションです。SpringMVCは、主にWeb開発を支援するために使用されます。MVCモードでは、バックエンドは、ビジネスを処理するためのサービスレイヤー、Daoレイヤーのデータベース操作、エンティティレイヤーのエンティティクラス、コントローラーレイヤーに分割され、データをフロントデスクに返します。
SpringMVC実行プロセス
- クライアントはにリクエストを送信します
DispatcherServlet
- DispatcherServletは、要求情報に従って呼び出され
HandlerMapping
、対応する要求を解決しHandler
ます。 - 対応するハンドラー(コントローラーコントローラー)を解析した後、H
andlerAdapter
とアダプターは処理を開始します。 - HandlerAdapterは、Handler
真正的处理器
および対応する論理ビジネスに従って処理要求を呼び出します。 - プロセッサは処理を終了した後、1つを返し
ModelandView对象
、Modelはデータオブジェクトを返し、Viewは論理ビューです。実際にはビューを表示していません ViewResolver
返されたビューに基づいて実際のビューを見つけます。- DispaterServletは、返されたモデルをレンダリングのためにビュービューに渡します
- ビューをクライアントに返す
Springで使用されるデザインパターン
工厂模式:
Springは、ファクトリパターンを使用して、BeanFactoryまたはApplicationContextを介してBeanオブジェクトを作成します。
BeanFactory:インジェクションの遅延。Beanが使用されている場合にのみ作成されます。
ApplicationContext:コンテナが起動すると、すべてのBeanが一度に作成されます
单例模式
:
SpringのBeanのデフォルトスコープはシングルトンです。
:Beanスコープと
シングルトンパターンを実現する方法Spring:
ConcurrentHashMap実装シングルトンレジストリによるシングルケースモデル。
// ConcurrentHashMapを介してシングルトンレジストリを実装します(スレッドセーフ)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "'beanName' must not be null");
synchronized (this.singletonObjects) {
// 检查缓存中是否存在实例
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
//...省略了很多代码
try {
singletonObject = singletonFactory.getObject();
}
//...省略了很多代码
// 如果实例对象在不存在,我们注册到单例注册表中。
addSingleton(beanName, singletonObject);
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
}
//将对象添加到单例注册表
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
}
}
}
代理模式
SpringAOPはプロキシモデルに基づいています。
プロキシオブジェクトがインターフェイスを実装している場合は、JDKプロキシを使用してプロキシオブジェクトを作成します。
プロキシオブジェクトが特定のインターフェイスを実装していない場合は、Cglibを使用してプロキシ用のプロキシオブジェクトのインスタンスを生成します。
SpringのプロキシはAspectJも使用でき、SpringはAspectJを統合します。スライス数が多い場合に使用できます。
模板方法
:動作中のアルゴリズムのスケルトンを定義し、サブクラスへのいくつかのステップを遅らせる動作設計パターンです。
Springでのテンプレートメソッドの使用は、主にJDBCTemplate、HiberbateTemplateなどのTemplateで終わるデータベース操作クラスに反映されます。
ただし、Springではテンプレートメソッドモードが改善されています。通常、テンプレートメソッドはサブクラスを使用して操作を実装します。Springでは、コールバックmode(コールバックモード)は、テンプレートメソッドと組み合わせて使用されます。
コールバックモード(コールバックモード):合意されたインターフェイスに従ってワークフロー内の特定の機能を外部ユーザーに公開するか、外部ユーザーにデータを提供するか、外部ユーザーにデータの提供を要求します。
观察者模式
:オブジェクトの動作モデルです。オブジェクトとオブジェクト間の依存関係を表します。オブジェクトが変更されると、オブジェクトが依存するオブジェクトも反応します。
このデザインパターンには、Springのイベント駆動型モデルが使用されます。
Springイベントの実行プロセスは次のとおりです。
(1)イベントを定義します:実現继承自 ApplicationEvent
、および対応するコンストラクターを記述します;
(2)イベントリスナーを定義します:solid现 ApplicationListener 接口
、;重写 onApplicationEvent() 方法
(3)
イベントパブリッシャーを使用してメッセージを公開します:からApplicationEventPublisher 的 publishEvent() 方法发布消息
。
适配器模式
:アダプタパターン(アダプタパターン)は、インターフェイスを顧客が望む別のインターフェイスに変換します。アダプタパターンを使用すると、インターフェイスと互換性のないクラスを連携させることができます。エイリアスはラッパーです。
SpringAOPの拡張機能または通知はすべて、アダプタパターン、関連するインターフェイス、AdvisorAdapterを使用します。
Springによって事前定義された通知は、対応するアダプターを介してMethodInterceptorインターフェース(メソッドインターセプター)タイプのオブジェクトに適合させる必要があります(例:MethodBeforeAdviceInterceptorはMethodBeforeAdviceの適合を担当します)。
SpringMVC中的适配器模式:
DispatcherServletは、リクエスト情報に従ってHandlerMappingを呼び出し、リクエストに対応するハンドラーを解析します。対応するハンドラー(つまり、通常言うコントローラーコントローラー)を解析した後、HandlerAdapterアダプターによる処理を開始します。
-
装饰者模式(包装器模式)
:オブジェクトにいくつかの追加のプロパティまたは動作を動的に追加します
。データソースがSpringで構成されている場合、データソースは異なるデータベースおよびデータソースである可能性があります。現時点では、デコレータモードを使用します(現時点では、特定の原則をあまり理解していません)。Springで使用されるラッパーパターンには、クラス名にラッパーまたはデコレータが含まれています。これらのクラスは基本的に、オブジェクトに動的に追加の責任を追加します。
- Springで使用されるデザインパターン:
- Spring IOCでは、Springはファクトリパターンを介してbeanFactoryおよびApplicationContextにBeanオブジェクトを作成します。
- プロキシモード:SpringAOPはプロキシモードに基づいています。
- アダプターモード:Spring AOPの追加または通知は、アダプターモードを使用します。アダプターパターンはSpringMVCでも使用されます。(HandlerAdapter)
- オブザーバーモード:Springのイベントモデルはオブザーバーモードを使用します
- ラッパーパターン:SpringのDataSourceは、ラッパーパターンを使用して、クラスに責任を動的に追加します。
- テンプレートメソッドパターン:Springでtemplateで終わるものはすべて、テンプレートメソッドパターンを使用します。JDBCTemplateなど
Springでトランザクションを管理する方法
- コードにハードコードされたプログラムによるトランザクション。
- 構成ファイルで構成された宣言型トランザクション。推奨される使用法。
宣言型トランザクションは次のように分けられます:
XML
アノテーション
Springのトランザクション分離レベル
- 分離レベルを表す5つの定数は、TransactionDefinitionインターフェースで定義されています。
TransactionDefinition.ISOLATION_DEFAULT:バックエンドデータベースのデフォルトの分離レベル、Mysqlで採用されているデフォルトのREPEATABLE_READ分離レベル、Oracleで採用されているデフォルトのREAD_COMMITTED分離レベルを使用します。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低の分離レベル。コミットされていないデータ変更を読み取ることができます。これにより、ダーティリード、ファントムリード、または繰り返し不可能なリードが発生する可能性があります。
TransactionDefinition.ISOLATION_READ_COMMITTED:同時トランザクションによってコミットされたデータを読み取ることができます。これにより、ダーティリードを防ぐことができますが、ファントムリードまたは繰り返し不可能なリードが発生する可能性があります。
TransactionDefinition.ISOLATION_REPEATABLE_READ:データがトランザクション自体によって変更されない限り、同じフィールドの複数の読み取りの結果は一貫しています。これにより、ダーティで繰り返し不可能な読み取りを防ぐことができますが、ファントム読み取りが発生する可能性があります。
TransactionDefinition.ISOLATION_SERIALIZABLE:最高の分離レベル。ACID分離レベルに完全に準拠しています。すべてのトランザクションは1つずつ実行されるため、トランザクション間の干渉はありません。つまり、このレベルでは、ダーティリード、繰り返し不可能なリード、およびファントムリードを防ぐことができます。しかし、これはプログラムのパフォーマンスに深刻な影響を及ぼします。通常、このレベルも使用されません。
Springでのトランザクションの伝播
- 時事問題をサポートする:
TransactionDefinition.PROPAGATION_REQUIRED(伝播が必要):現在トランザクションがある場合は、トランザクションに参加します。現在トランザクションがない場合は、新しいトランザクションを作成します。
TransactionDefinition.PROPAGATION_SUPPORTS(伝播サポート):現在トランザクションがある場合は、トランザクションに参加します。現在のトランザクションがない場合は、非トランザクション方式で実行を継続します。
TransactionDefinition.PROPAGATION_MANDATORY(伝播必須):現在トランザクションがある場合はトランザクションに参加します。現在トランザクションがない場合は例外がスローされます。(必須:必須)
- 現在のトランザクションをサポートしていません
TransactionDefinition.PROPAGATION_REQUIRES_NEW:新しいトランザクションを作成します。現在トランザクションがある場合は、現在のトランザクションを一時停止します。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非トランザクションモードで実行します。現在トランザクションがある場合、現在のトランザクションは一時停止されます。
TransactionDefinition.PROPAGATION_NEVER:非トランザクションモードで実行します。現在トランザクションが存在する場合、例外がスローされます。
- その他の場合:
TransactionDefinition.PROPAGATION_NESTED:現在トランザクションがある場合は、現在のトランザクションのネストされたトランザクションとして実行するトランザクションを作成します。現在のトランザクションがない場合、値はTransactionDefinition.PROPAGATION_REQUIREDと同等です。新しいトランザクションを作成する
@Transactional(rollbackFor = Exception.class)アノテーションは理解できますか?
@Transactionalアノテーションがクラスに適用されると、クラスのすべてのパブリックメソッドにこのタイプのトランザクション属性が割り当てられます。同時に、メソッドレベルでこのアノテーションを使用して、クラスレベルの定義をオーバーライドすることもできます。このアノテーションがクラスまたはメソッドに追加されると、このクラスのメソッドは例外をスローし、それがロールバックされ、データベース内のデータもロールバックされます。
rollbackFor属性が@Transactionalアノテーションで構成されていない場合、RuntimeExceptionが発生した場合にのみロールバックされ、rollbackFor = Exception.classは、ランタイム以外の例外が発生した場合にロールバックできます。
JPAとは何ですか?
JPA(javaパーシスタンスAPI)は、JavaEEおよびJavaSE環境でのパーシスタンスを管理するために使用され、オブジェクト/リレーショナルマッピング用のJavaAPI
は、データパーシスタンスを処理するためのインターフェースです。
- エンティティ(pojo)は、リレーショナルデータベースのテーブルを表します
- 各エンティティインスタンスは、テーブルの行に対応します
- クラスにはjavax.persistence.Entityアノテーションを付ける必要があります。
クラスには、パブリックまたは保護されたパラメーターなしのコンストラクターが含まれている必要があります。- エンティティインスタンスが個別のオブジェクトとして渡される値として使用される場合(たとえば、セッションBeanのリモートビジネスインターフェイスを介して)、クラスはSerializableインターフェイスを実装する必要があります
- 一意のオブジェクト識別子、単純な主キー(javax.persistence.Id)、複合主キー(javax.persistence.EmbeddledIdおよびjavax.persistence.IdClass)
JPAを使用して、データベース内のフィールドを非永続化します
- 静的変更静的変更
- 最終変更に変更
- 一時的な変更
- @Transientアノテーションの変更