Spring5コアテクノロジーAOP基本プロジェクト実践詳細記録

目次

1つは、Springフレームワークを知っている

2.制御の反転と依存性注入(IoC + DI)

3.アスペクト指向プログラミング(AOP)

1.AOPの原則

2.AOPの6つの基本概念

水平フォーカス

セクション

ジャンクション

カットオフポイント

通知

4、AOPはコアケースを使用します

1.新しいSpringプロジェクトを作成します

2.簡単なビジネスクラスを作成する

3.アスペクトクラスを作成します 

4.構成クラスを作成します

5.メインテストクラスを作成します

5つのBUGソリューション

1、Bug1:java.util.prefs.WindowsPreferences

2、Bug2:警告log4jシステムを正しく初期化してください


1つは、Springフレームワークを知っている

私はずっと春という名前をずっと尊敬してきましたが、それが何であるかわかりません。私は最近ゼロから学び始め、基本的な理解があるので、ここに記録します。

実際、Springフレームワークの名前の由来に非常に興味があり、具体的に確認しました。

名前は自然界に由来します。実際、春は伝統的なJ2EEの冬の過去を表しており、Java EE開発の新時代を示しているので、このシンプルでエレガントな名前に同意します。

Springフレームワークの力は、J2EE開発を簡素化し、一般的に使用される関数のほとんどをカプセル化することです。実現の原則は、制御の反転とアスペクト指向プログラミングの2つの技術原則に依存しています。

Springフレームワークは主要なモジュールで構成されています。Spring5には次のものがあります。

  1. コアモジュールコア:依存性注入(DI)、アスペクト指向プログラミング(AOP)、イベント処理(イベント)、リソースアクセス(リソース)、データバインディング(データバインディング)、i18n(国際化)など。
  2. テストモジュールテスト: Spring MVCテスト、WebTestClient、TestContextフレームワーク、モックオブジェクトテストフレームワークをサポートします。
  3. データアクセスモジュールデータアクセス:トランザクション処理(トランザクション)、データアクセスオブジェクト(DAO)、データベース接続(JDBC)、オブジェクトリレーショナルマッピング(ORM)、および処理XML(マーシャリングXML)。
  4. SpringMVCモジュールSpringWebFlux WebFrameworkモジュール。 
  5. 統合モジュール統合:リモートアクセス(リモート処理)、メッセージサービス(JMS)、暗号化と復号化(JCA)、管理拡張機能(JMX)、メール管理(メール)など。
  6. サポートされる言語 KotlinやGroovyなどの言語での開発をサポートします。

これを学んだ後、Springの機能は特に包括的で強力であることがわかりました。「山から学ぶ方法があり、学ぶことに終わりはありません。」もう一度、それは最良の解釈を与えます。ただ学んでいるXiaobaiにとって、どこから始めればいいのかわからないので、次のステップは次のとおりです。最も基本的な部分は、学習を開始するための非常に重要な技術原則でもあります。

2.制御の反転と依存性注入(IoC + DI)

通常のプログラミングプロジェクトでは、A.javaでB.javaクラスを使用する場合は、AでBクラスオブジェクトをインスタンス化する必要があります。その結果、AとBが緊密に結合され、「侵入型開発」になります。プロジェクトの更新とアップグレードに伴い、機能を追加する必要があり、ビジネスコードのカテゴリBに多数の拡張と変更が必要になるため、カテゴリAも変更する必要があると仮定します。明らかに、これはそうではありません。ソフトウェアの更新と保守に役立ちます。

したがって、SpringのIoCテクノロジーはこの問題を解決し、反射テクノロジーによる制御の反転を実現します。IoCは、呼び出し元Aを呼び出し先Bから分離し、「低結合」の期待に応えるために、クラスとクラスの間の直接的な関係を切り離します。

上の図に示すように、SpringフレームワークのIoCテクノロジーは、クラスAとクラスBの分離を実現します。クラスAでは、新しいB()は必要ありません。代わりに、インスタンス化タスクがSpringに渡されて完了します。 、次に反射メカニズムを使用してオブジェクトをインスタンス化します。Aのbオブジェクトに割り当てられます。

もともとAが主導してタイプBのオブジェクトをインスタンス化していましたが、現在はパッシブパーティになっています。これは、反転を実現するSpringフレームワークによって実現されるため、「制御の反転」と呼ばれます。


IoCはここで設計のアイデアになり、割り当ての具体的な実装方法は依存性注入(DI)です。SpringでJavaBeansを管理するコンテナはIoCコンテナです。上記のBタイプのオブジェクトはコンテナによって作成され、コンテナはAにbのオブジェクト値を挿入します。したがって、DIはリフレクションテクノロジを使用してクラス属性を動的に割り当てます。IoC / DIは、プログラミング技術の観点からインターフェースと実装メソッドを分離します。IoCコンテナーは、JavaBeansのライフサイクルと複数のJavaBeansの注入関係を管理します。

3.アスペクト指向プログラミング(AOP)

テクノロジーの誕生は、ある種の問題を解決することである必要があります。SpringのAOPテクノロジーは、実行時間、実行者、効率、結果などの情報を含むプログラムログ情報などのソフトウェアプロジェクトの普遍的な問題を解決することです。

ソースプログラムでログコードを追加または削除すると、プログラム操作の効率に影響を与え、ソフトウェアをモジュール式に保守することが難しく、面倒です。したがって、動的プロキシベースのAOPテクノロジは、コードを変更せずに元のモジュールの機能を拡張し、常用対数モジュールを分離し、モジュラー管理を容易にすることができます。

たとえば、サーブレットコードを変更せずにロギング機能を追加したり、SpringMVCフレームワークの制御層コードを変更せずにデータベーストランザクション機能を追加したりします。

1.AOPの原則

Spring AOPテクノロジーは、プロキシデザインパターン、いわゆるプロキシの原則に基づいています。ここでの理解は、このオブジェクトへのアクセスを制御するために他のオブジェクトにプロキシを提供することです。オブジェクトが適切でない場合や、別のオブジェクトを直接参照できない場合があり、プロキシオブジェクトはクライアントとターゲットオブジェクトの間の仲介役として機能する必要があります。

プロキシ設計モードは、静的プロキシと動的プロキシに分けられます。静的プロキシは、プロキシクラスが固定インターフェイスにバインドされているため、拡張に役立ちません。主に動的プロキシについて学習します。

Javaでは、動的エージェントを実装するための4つの一般的な方法があります。

  1. JDKが提供する動的プロキシ
  2. cglibフレームワーク
  3. javaassistフレームワーク
  4. SpringFramework

次のケースでは、Springフレームワークを使用してAOP動的プロキシを実装します。

2.AOPの6つの基本概念

  • 水平フォーカス

水平方向の焦点は、汎用性の機能です。一般的に使用される水平方向の懸念事項には、メソッド実行時間の記録、アクセス許可の検証、通常のログ、およびデータベーストランザクション処理が含まれます。

ログ機能コードやサービスビジネスコードなどの一般的なコードを分離して、デカップリングの目的を達成します。DIの性質とは異なり、AOPのデカップリングは主に水平フォーカスのコードとビジネスコードの間の分離であり、依存性注入はオブジェクト間のデカップリングです。

  • セクション

アスペクトは水平フォーカスポイントのモジュール化であり、各アスペクトは水平フォーカスポイント機能の実現であり、共通のコードを抽出して個別のクラスに分類し、再利用に便利な統合処理を行います。このクラスはアスペクトクラスであり、アスペクト指向プログラミングは主にアスペクトに基づいてコードを書くことです。

  • ジャンクション

接続ポイントは、切断面に挿入できるソフトウェアプログラム内のポイントです。接続ポイントの場所は、メソッドが呼び出される前/後、例外がスローされたとき、戻り値の後などになります。

  • カットオフポイント

カットポイントは接続ポイントの一部であり、接続ポイントの数を減らし、カット面をカットポイントに適用し、ソフトウェア操作の効率を向上させる概念です。

  • 通知

Spring AOPには、次の5種類の通知があります。

(1)通知前(前):メソッドが呼び出される前。

(2)通知後(後):メソッドが呼び出された後。

(3)アラウンド通知(アラウンド):メソッドが呼び出される前後。

(4)アフターリターン:メソッドには戻り値があります。

(5)投球後:方法が異常です。

この側面には、通知と、2つの組み合わせである連絡先が含まれます。通知がアスペクトを適用するタイミングを定義し、接点がアスペクトが配置される場所を定義することを理解するのは簡単です。

4、AOPはコアケースを使用します

「紙の上では常に浅い」という以前の知識の多くは理解されていない可能性があります。そうすると、AOPの単純なアプリケーションでは、理論の実際のアプリケーションをより直感的に確認できます。

IDE:Intellij IDEAUバージョン

JDK:jdk1.8.0

春:春5.2.3

アスペクト:Aspectj1.9

1.新しいSpringプロジェクトを作成します

srcファイルの下にパッケージSpring_AOPを作成します。私のファイル構造は次のとおりです。

アノテーションを使用して前述のアドバイスを実装します。アノテーションはSpringの重要なアプリケーションであり、xmlを手動で構成するという面倒な作業を減らすことができます。

2.簡単なビジネスクラスを作成する



/*
 * UserinfoService.java
 * Copyright (c) 2021-02-25
 * LastModified:2021/2/25 上午10:48
 * Author : Charzous
 * Blog : https://blog.csdn.net/Charzous
 * All right reserved.
 */

package Spring_AOP.aopDemo.service;

import org.springframework.stereotype.Service;

@Service(value = "a")
public class UserinfoService {
    public void method1() {
        System.out.println("method 1 ");
    }

    public String method2() {
        System.out.println("method 2");
        return "我是方法2返回值";
    }

    public String method3() {
        System.out.println("method 3:测试异常");
        Integer.parseInt("a");//测试error
        return "我是方法3返回值";
    }
}

3.アスペクトクラスを作成します 



/*
 * AspectObject.java
 * Copyright (c) 2021-02-25
 * LastModified:2021/2/25 上午10:55
 * Author : Charzous
 * Blog : https://blog.csdn.net/Charzous
 * All right reserved.
 */

package Spring_AOP.aopDemo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AspectObject {


    @Around(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")//
    //注解实现环绕通知
    public Object around(ProceedingJoinPoint point) {
        Object returnObject = null;
        try {
            System.out.println("环绕开始");
            returnObject = point.proceed();
            System.out.println("环绕结束");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return returnObject;
    }

    //*:任意返回值;service.UserinfoService.* service包下UserinfoService类中任意方法;.. 任意类型的参数
    @Before(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")
    public void before() {
        System.out.println("Before 方法");
    }

    @After(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")
    public void after() {
        System.out.println("After 方法");
    }

    @AfterReturning(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")
    public void afterReturning() {
        System.out.println("afterReturning");
    }

    @AfterThrowing(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")
    public void afterThrowing() {
        System.out.println("afterThrowing");
    }

}

 事前通知、事後通知、戻り通知、サラウンド通知、および例外通知がコードに実装され、アスペクト式使用してビジネスクラス照合します。

アスペクト式は一貫しており、さらに最適化すると、グローバルな接点を介して式の冗長性減らすことができます。



/*
 * AspectObject.java
 * Copyright (c) 2021-02-25
 * LastModified:2021/2/25 上午10:55
 * Author : Charzous
 * Blog : https://blog.csdn.net/Charzous
 * All right reserved.
 */

package Spring_AOP.aopDemo.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AspectObject {
    //使用全局切点,使表达时全局化,减少冗余
    @Pointcut(value = "execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))")
    public void publicPointCut(){

    }

    @Around(value = "publicPointCut()")//"execution(* Spring_AOP.aopDemo.service.UserinfoService.*(..))"
    //注解实现环绕通知
    public Object around(ProceedingJoinPoint point) {
        Object returnObject = null;
        try {
            System.out.println("环绕开始");
            returnObject = point.proceed();
            System.out.println("环绕结束");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return returnObject;
    }

    //*:任意返回值;service.UserinfoService.* service包下UserinfoService类中任意方法;.. 任意类型的参数
    @Before(value = "publicPointCut()")
    public void before() {
        System.out.println("Before 方法");
    }

    @After(value = "publicPointCut()")
    public void after() {
        System.out.println("After 方法");
    }

    @AfterReturning(value = "publicPointCut()")
    public void afterReturning() {
        System.out.println("afterReturning");
    }

    @AfterThrowing(value = "publicPointCut()")
    public void afterThrowing() {
        System.out.println("afterThrowing");
    }

}

4.構成クラスを作成します

アノテーションを使用して、指定されたパッケージ内の各クラスをスキャンすると、Springが自動構成を完了します。このクラスはSpring動的プロキシも実装します。正しく構成するには、完全なパッケージ名を使用する必要があることに注意してください。



/*
 * MyContext.java
 * Copyright (c) 2021-02-25
 * LastModified:2021/2/20 下午10:28
 * Author : Charzous
 * Blog : https://blog.csdn.net/Charzous
 * All right reserved.
 */

package Spring_AOP.aopDemo;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"Spring_AOP.aopDemo.service","Spring_AOP.aopDemo.aspect"})
public class MyContext {
}

5.メインテストクラスを作成します



/*
 * aopDemo_test.java
 * Copyright (c) 2021-02-25
 * LastModified:2021/2/20 下午6:58
 * Author : Charzous
 * Blog : https://blog.csdn.net/Charzous
 * All right reserved.
 */

package Spring_AOP.aopDemo;

import Spring_AOP.aopDemo.service.UserinfoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class aopDemo_test {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(MyContext.class);
        UserinfoService service=(UserinfoService) context.getBean(UserinfoService.class);
        service.method1();
        System.out.println();
        System.out.println("get method 2 return value="+service.method2());

        System.out.println();
        System.out.println("get method 3 return value="+service.method3());
    }
}

 ご覧のとおり、ApplicationContextは注釈を使用してコンテキストを解析し、もう1つの方法はXMLファイルの解析です。

方法3のテスト例外通知。結果は次のとおりです。

5つのBUGソリューション

1、Bug1:java.util.prefs.WindowsPreferences <init>

プログラムをテストして実行しているときに、警告が表示されました。

java.util.prefs.WindowsPreferences <init>

警告:ルート0x80000002で設定ルートノードSoftware \ JavaSoft \ Prefsを開く/作成できませんでした。Windows RegCreateKeyEx(...)がエラーコード5を返しました。

動作には影響しませんが、解決したほうがいいです。

解決する:

Windowsレジストリエディタを開き、次のディレクトリを見つけます

HKEY_LOCAL_MACHINE\Software\JavaSoft

次に、新しいフォルダPrefsを作成します。

2、Bug2:警告log4jシステムを正しく初期化してください

別の警告が表示されます:

log4j:WARNロガー(org.springframework.XXX)のアペンダーが見つかりませんでした。
log4j:WARNlog4jシステムを正しく初期化してください。

これはMybatisのlog4jメッセージログフレームワークです。私が作成した別のパッケージはMybatisフレームワークを使用しているため、この実行にはほとんど影響がなく、警告メッセージが出力されます。

解決する:

srcの下に新しいlog4j.propertiesファイルを作成する必要があるだけです。内容は次のとおりです。

#
# log4j.properties
# Copyright (c) 2021-02-25
# LastModified:2021/2/24 下午9:42
# Author : Charzous
# Blog : https://blog.csdn.net/Charzous
# All right reserved.
#

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

 この時点で、Spring 5コアテクノロジーAOPの簡単な基本プラクティスが完了しました。Springフレームワークの力は、J2EE開発を簡素化し、一般的に使用される機能のほとんどをカプセル化することです。実現の原則は、制御の反転(IoC)とアスペクト指向プログラミング(AOP)の2つの技術原則に依存しています。この記事は、主にSpringの基本的な知識とAOPの実現について理解しており、ある程度の基本的な理解があるため、ここに記録します。

良いと思う場合は、ブックマーク、フォロー、質問がある場合は直接コメント、交換して学ぶなど、「ワンクリック、3リンク」へようこそ。 


私のCSDNブログ:https://blog.csdn.net/Charzous/article/details/114044697

おすすめ

転載: blog.csdn.net/Charzous/article/details/114044697