mysqltutorial コラムでは、Spring についてマスターしなければならないことを紹介します。 ###########################こんにちは、みんな!私は熱心な朝陽族の一員です。
Spring フレームワークの紹介
IOC (Inversion Of Controll、制御の反転) は設計上のアイデアです。プログラム内で手動で作成されたオブジェクトの制御は Spring フレームワークに渡されます。 IOC は他の言語でも使用されており、Spring に固有のものではありません。 IOCコンテナはSpringがIOCを実装するために使用するキャリアであり、実際にはMap(キー、値)であり、Map内に様々なオブジェクトが格納されます。
オブジェクト間の相互依存関係を IOC コンテナによって管理されるようにすると、IOC コンテナはオブジェクトの挿入を完了します。これにより、アプリケーション開発が大幅に簡素化され、アプリケーションを複雑な依存関係から解放できます。 IOC コンテナは工場のようなもので、オブジェクトを作成する必要がある場合、オブジェクトがどのように作成されるかを考えずに、設定ファイルやアノテーションを設定するだけで済みます。実際のプロジェクトでは、Service クラスの最下位層として数百、さらには数千のクラスが存在する場合があります。この Service をインスタンス化する必要がある場合、毎回、この Service の基になるすべてのクラスのコンストラクターを把握する必要があり、混乱する可能性があります。人々は気が狂いそうになる。 IOC を使用する場合、IOC を設定して必要な箇所で参照するだけで済むため、プロジェクトの保守性が大幅に向上し、開発の難易度が軽減されます。Spring の時代には、XML ファイルを使用して Bean を設定するのが一般的でしたが、その後、開発者は XML ファイルを使用して Bean を設定するのはよくないと感じたため、Spring Boot アノテーション設定が徐々に普及してきました。
AOP(アスペクト指向プログラミング、アスペクト指向プログラミング) ) システム内のコードの重複を減らすために、ビジネスとは関係がないがビジネス モジュールによって一般的に呼び出されるロジックや責任 (トランザクション処理、ログ管理、権限制御など) をカプセル化できます。 、モジュール間の結合を軽減し、将来の拡張性と保守性に貢献します。
Spring AOP はダイナミック プロキシに基づいています。プロキシされるオブジェクトが特定のインターフェイスを実装している場合、Spring AOP は JDK ダイナミック プロキシを使用してプロキシ オブジェクトを作成しますが、インターフェイスを実装していないオブジェクトの場合は、 JDK ダイナミック プロキシは、代わりに CGlib ダイナミック プロキシを使用して、プロキシ オブジェクトのサブクラスをプロキシとして生成します。
もちろん、AspectJ を使用することもできます。Spring AOP には AspectJ が統合されています。AspectJ は、Java エコシステムで最も完全な AOP フレームワークと見なされるべきです。 AOP を使用すると、いくつかの一般的な関数を抽象化し、必要な場所で直接使用できるため、コードの量を大幅に簡素化できます。新しい機能を便利に追加し、システムの拡張性を向上させる必要があります。 AOP は、ログ機能、トランザクション管理、権限管理などのシナリオで使用されます。
Spring AOP はランタイム拡張機能です。 、AspectJ はコンパイル時の機能強化です。 Spring AOP はプロキシ処理に基づいていますが、AspectJ はバイトコード操作に基づいています。
Spring AOP には AspectJ が統合されており、これは Java エコシステムで最も完全な AOP フレームワークとみなされます。 AspectJ は Spring AOP より強力ですが、Spring AOP は比較的単純です。
アスペクトの数が少ない場合、2 つの間のパフォーマンスの差はほとんどありません。ただし、アスペクトが多すぎる場合は、SpringAOP よりもはるかに高速な AspectJ を選択するのが最善です。
ほとんどの場合、システムでマルチスレッドを使用しないため、この問題に注目する人はほとんどいません。シングルトン Bean にはスレッドの問題があります。主な理由は、複数のスレッドが同じオブジェクトを操作する場合、このオブジェクトの非静的メンバー変数に操作を書き込むとスレッドの安全性の問題が発生するためです。
一般的な解決策は 2 つあります。
Spring の Bean のライフサイクル?
**Model1 時代:** Java を学んだのが遅いバックエンド プログラマの多くは、Model1 モードでの JavaWeb アプリケーション開発に慣れていない可能性があります。 Model1 モードでは、Web アプリケーション全体がほぼすべて JSP ページで構成され、データベース接続、アクセス、その他の操作の処理に少数の JavaBeans のみが使用されます。このモードでは、JSP はコントロール層とプレゼンテーション層の両方になります。明らかに、このモデルには多くの問題があります。例えば、制御ロジックと性能ロジックが混在してコードの再利用率が極端に低かったり、フロントエンドとバックエンドが相互に依存しているためテストが困難で開発効率が非常に低かったりするなどです。
モデル 2 時代 : サーブレットを研究し、関連デモを行ったことのある友人は、Java Bean (モデル) JSP (ビュー) サーブレット (コントローラー) の開発モデルを理解しているはずです。これは初期の Java Web です。 MVC開発モデル。モデルはシステムに関係するデータ、つまり dao と Bean です。ビューはモデル内のデータを表示するために使用されます (表示のみ)。コントローラーはユーザーのリクエストを処理のためにサーブレットに送信し、データを JSP に返して表示します。ユーザー。
Model2 モードにはまだ多くの問題があります。Model2 の抽象化とカプセル化の度合いは十分とは言えません。開発に Model2 を使用する場合、車輪の再発明が避けられず、保守性と使いやすさが大幅に低下します。プログラムの再利用性。その結果、Struts2 など Java Web 開発に関連する MVC フレームワークが数多く誕生しましたが、Struts2 は比較的扱いにくいため、Spring の軽量開発フレームワークの人気に伴い、Spring MVC フレームワークが Spring エコシステムに登場しました。 Spring MVC は現在最高の MVC フレームワークであり、Struts2 に比べてシンプルで使いやすく、開発効率が高く、動作も高速です。
MVC はデザイン パターンであり、Spring MVC は優れた MVC フレームワークです。 Spring MVC は、より簡潔な Web 層の開発に役立ち、Spring フレームワークと自然に統合されています。 Spring MVCでは通常、バックエンドプロジェクトをサービス層(処理ビジネス)、Dao層(データベース操作)、エンティティ層(エンティティクラス)、コントローラー層(データをフロントエンドページに返す制御層)に分割します。
Spring MVC の簡単な概略図は次のとおりです。
##Spring フレームワークではどのようなデザイン パターンが使用されていますか?
@Configurationpublic class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); }}复制代码
<beans> <bean id="transferService" class="com.common.TransferServiceImpl"/></beans>复制代码
@Beanpublic OneService getService(status) { case (status) { when 1: return new serviceImpl1(); when 2: return new serviceImpl2(); when 3: return new serviceImpl3(); }}复制代码
我们一般使用@Autowired注解去自动装配bean。而想要把一个类标识为可以用@Autowired注解自动装配的bean,可以采用以下的注解实现:
在TransactionDefinition接口中定义了五个表示隔离级别的常量:
**ISOLATION_DEFAULT:**使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
**ISOLATION_READ_UNCOMMITTED:**最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
**ISOLATION_READ_COMMITTED: **同時トランザクションによって送信されたデータの読み取りを許可します。これによりダーティ リードを防ぐことができますが、ファントム リードや反復不可能な読み取りが発生する可能性があります。
**ISOLATION_REPEATABLE_READ:**同じフィールドの場合、データが独自のトランザクション自体によって変更されない限り、複数の読み取りの結果は一貫しています。これにより、ダーティ リードや反復不可能な読み取りを防ぐことができますが、ファントム リードが発生する可能性はあります。
**ISOLATION_SERIALIZABLE: **ACID 分離レベルに完全に準拠した最高の分離レベル。すべてのトランザクションは順番に実行されるため、トランザクション間で干渉する可能性がなく、ダーティリード、ノンリピートリード、ファントムリードを防ぐことができます。しかし、これはプログラムのパフォーマンスに重大な影響を与えます。通常、このレベルは使用されません。
トランザクションの伝播動作を表す 8 つの定数が、TransactionDefinition インターフェイスで定義されています。
**PROPAGATION_REQUIRED: **トランザクションが現在存在する場合は、トランザクションに参加します; 現在トランザクションがない場合は、新しいトランザクションを作成します。
PROPAGATION_SUPPORTS: 現在トランザクションが存在する場合はトランザクションに参加し、現在トランザクションが存在しない場合は非トランザクションで実行を継続します。
PROPAGATION_MANDATORY: 現在トランザクションが存在する場合はトランザクションに参加し、現在トランザクションが存在しない場合は例外をスローします。 (必須: 必須)。
#PROPAGATION_REQUIRES_NEW: 新しいトランザクションを作成します。トランザクションが現在存在する場合は、現在のトランザクションを一時停止します。
PROPAGATION_NOT_SUPPORTED: 非トランザクション モードで実行します。現在トランザクションが存在する場合、現在のトランザクションは一時停止されます。
PROPAGATION_NEVER: 非トランザクション モードで実行し、トランザクションが現在存在する場合は例外をスローします。
その他の状況:
PROPAGATION_NESTED: トランザクションが現在存在する場合は、現在のトランザクションのネストされたトランザクションとして実行するトランザクションを作成します。トランザクションがない場合、この値は PROPAGATION_REQUIRED と同等になります。
この内容をマスターしていただき、引き続き私をサポートしていただければ幸いです。ありがとうございました。
#その他の関連する無料学習の推奨事項: mysql チュートリアル(ビデオ)
以上が集める!春がマスターしなければならないことの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。