1つのプログラミングパラダイム
1.1プロセス指向
1.2オブジェクト指向
1.3アスペクト指向プログラミング
1.4関数型プログラミング
1.5イベント駆動型プログラミング
2アスペクト指向プログラミングとは何ですか
2.1はプログラミングパラダイムではなく、プログラミング言語であります
いくつかの特定の問題を解決するための2.2
によるオブジェクト指向プログラミングとして2.3
3 AOPは、元の意図を生成しました
3.1コードの再現性は、問題を解決するあなた自身を繰り返してはいけません
懸念の3.2分離は懸念の問題分離に対処します
3.2.1水平分離(技術部門)
制御層 - >レイヤサービス - >永続化層
3.2.2垂直分離(モジュール部門)
モジュール部門
分離セクション3.2.3(機能的に分割)
分離機能要件と非機能要件
AOPを使用しての4つの利点
4.1ロジックをクロスカット、関心の特定のポイントに焦点を当てます
4.2簡単に削除、追加することができ、懸念
侵入4.3コードの可読性と保守性を向上させる、軽減
5つのAOP使用シナリオ
5.1アクセス制御
キャッシュ制御5.2
5.3トランザクション制御
5.4監査ログ
5.5パフォーマンスの監視
5.6分散型トラック
5.7例外処理
6伝統的な方法を使用して能力の検証を実現
6.1プロジェクトspringBootを作成します
ダウンロード:Go]をクリックしてください
6.2製品のエンティティクラスを作成します。
Product.java
新しいクラスを作成するために、6.3アナログ許可
このクラスは、主にユーザーを設定し、ユーザーを取得するために使用されます
用cn.test.demo.base_demo.security Package変更; / ** * @author王ヤン元帥 * @Create 2018年4月29日17:15 *は、ユーザーがユーザーとアクセスの種類を設定することができ、ユーザがログインをシミュレート@desc ** / {クラスCurrentSetHolder公共 民間最終静的にThreadLocal <文字列> =新しい新しいホルダーにThreadLocal <>(); / ** *ユーザー取得 * @return * / パブリック静的GET文字列は、(){ == nullの「不明)(holder.getを返しますか? 「:holder.get(); } / ** *ユーザ設定 * @paramユーザー * / パブリック静的ボイド集合(文字列ユーザ){ holder.set(ユーザ); } }
6.4新しいクラスチェックの権限を作成します。
このクラスは、主に現在のユーザーは、「管理者」のユーザーであるかどうかを決定するために使用されます
cn.test.demo.base_demo.serviceパッケージペナルティのため、 インポートcn.test.demo.base_demo.security.CurrentSetHolder; インポートorg.springframework.stereotype.Component; / ** * @author王ヤン元帥 *の@Create 2018年4月29日17:19 *サービスクラスをチェックする@desc許可 ** / @Component パブリッククラスのAuthService { / ** *ユーザーは、「管理者」でないかどうかを確認するための許可はエラーになります * / 公共のボイドのcheckAccessを(){ 文字列=ユーザーをCurrentSetHolder.get (); IF {(! "ADMIN" .equals(ユーザー)) スロー新しい新しいのRuntimeException( "NOT演算を可能にします。"); } } }
6.5新しいクラスProductService
これは、潜在的に製品にいくつかの操作を実現しています
ProductService.java
サービス層のテストクラスを作成するには、6.6
ProductServiceのinsertメソッドを呼び出す前に設定したユーザー
ProductServiceTest.java
AOPの実装検証を使用するための7の許可
7.1新しいプロジェクトを作成しますspringBoot
ダウンロード:Go]をクリックしてください
7.2製品のエンティティクラスを作成します
パッケージcn.test.demo.base_demo.entity。 / ** * @author王杨帅 * @Create 2018年4月29日17時11 * @desc商品实体类 ** / publicクラスの製品{ プライベート整数ID。 プライベート文字列名; パブリック製品(){ } 公共製品(整数ID、文字列名){ this.id = ID。 this.name =名前; } パブリック整数のgetId(){ IDを返します。 } 公共ボイドSETID(整数ID){ this.id = ID。 } パブリック文字列のgetName(){ 戻り名。 } 公共ボイドのsetName(文字列名){ this.name =名。 } @Override パブリック文字列のtoString(){ 戻り"商品{" + "ID =" + ID + "NAME = '" +名+ '\'' + '}'。 } }
7.3 AdminOnlyコメントを作成します
パッケージcn.test.demo.base_demo.security。 輸入java.lang.annotation.ElementType。 輸入java.lang.annotation.Retention。 輸入java.lang.annotation.RetentionPolicy。 輸入java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) パブリック@interface AdminOnly { }
7.4特権のシミュレータを作成します。
このクラスは、主にユーザーを設定し、ユーザーを取得するために使用されます
用cn.test.demo.base_demo.security Package変更; / ** * @author王ヤン元帥 * @Create 2018年4月29日17:15 *は、ユーザーがユーザーとアクセスの種類を設定することができ、ユーザがログインをシミュレート@desc ** / {クラスCurrentSetHolder公共 民間最終静的にThreadLocal <文字列> =新しい新しいホルダーにThreadLocal <>(); / ** *ユーザー取得 * @return * / パブリック静的GET文字列は、(){ == nullの「不明)(holder.getを返しますか? 「:holder.get(); } / ** *ユーザ設定 * @paramユーザー * / パブリック静的ボイド集合(文字列ユーザ){ holder.set(ユーザ); } }
7.5クラスセクションを作成します
このクラスは、主に使用されているすべてのアノテーション付きメソッドをチェックするための許可のためである@AdminOnly
パッケージcn.test.demo.base_demo.security。 輸入cn.test.demo.base_demo.service.AuthService; 輸入org.aspectj.lang.annotation.Aspect; 輸入org.aspectj.lang.annotation.Before; 輸入org.aspectj.lang.annotation.Pointcut; 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Component。 / ** * @author王杨帅 * @Create 2018年4月29日夜05時37 * @desc权限检查的AOP类 ** / @Aspect @Component パブリッククラスSecurityAspect { @Autowired のAuthServiceのAuthService。 @Pointcut( "@アノテーション(AdminOnly)") 公共ボイドadminOnly(){ } @Before( "adminOnly()") 公共ボイド検査(){ authService.checkAccess()。 } }
7.6サービスクラスProductServiceを作成します。
@AdminOnlyノートを持つクラスのメソッドを削除し、その方法は、権限がチェックし、削除します
ProductService.java
7.7テストクラスを作成します。
productService.delete(ID)の方法ではない「管理者」ユーザー・エラーが実装される場合、検証する権限を持っている] [AOPを使用
ProductServiceTest.java