アスペクト指向プログラミング (AOP) を導入するには、まず次のようなシナリオを検討する必要があります。現在、会社には人事管理システムがあります。オンラインになっていますが、システムの動作が不安定で、動作が非常に遅い場合があります。どのリンクに問題があるかを検出するために、開発者は各メソッドの実行時間を監視し、これらの実行時間に基づいて問題を判断したいと考えています。問題が解決したら、これらのモニターを取り外します。システムは現在実行中です。システム内の何千ものメソッドを手動で変更すると、作業負荷が大きくなりすぎるため、将来的にはこれらの監視メソッドを削除する必要があります。システムの実行中にコードを動的に追加できる場合は、問題は非常によく解決できます。アスペクト指向プログラミング (AOP) は、システム ランタイムにコードを動的に追加する方法です。 Spring Boot は AOP を適切にサポートします。 AOP には、理解すべき共通の概念がいくつかあります。
結合ポイントは、拡張可能なクラス内のメソッドを指します。たとえば、そのメソッドの機能を変更する場合、そのメソッドは接続ポイントです。
ポイントカットは、ジョインポイントのインターセプトを定義する操作を指します。この定義は、エントリ ポイントとして挿入で始まるすべてのメソッドをインターセプトすることを指します。
Joinpoint をインターセプトした後、実行される操作は通知を送信することです。たとえば、前述した印刷ログの監視です。通知は、事前通知、事後通知、例外通知、最終通知、および周囲の通知に分類されます
アスペクト: ポイントカットとアドバイスの組み合わせ
Target (ターゲット オブジェクト): 拡張されるクラスは Target になります
Spring Boot は、Spring に基づいた AOP 構成の自動化を提供します。 spring-boot-starter-aop では、まず次のように依存関係を導入します。
<!-- AOP 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
次に、次のように com.sang.aop.service パッケージの下に UserService クラスを作成します。
@Service public class UserService { public String getUserById(Integer id){ System.out.println("get..."); return "user"; } public void deleteUserById(Integer id){ System.out.println("delete..."); } }
次に、アスペクトは次のとおりです:
@Component @Aspect public class LogAspect { @Pointcut("execution(* com.sang.aop.service.*.*(..))") public void pc1() { } @Before(value = "pc1()") public void before(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法开始执行..."); } @After(value = "pc1()") public void after(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法执行结束..."); } @AfterReturning(value = "pc1()", returning = "result") public void afterReturning(JoinPoint jp, Object result) { String name = jp.getSignature().getName(); System.out.println(name + "方法返回值为:" + result); } @AfterThrowing(value = "pc1()",throwing = "e") public void afterThrowing(JoinPoint jp, Exception e) { String name = jp.getSignature().getName(); System.out.println(name+"方法抛异常了,异常是:"+e.getMessage()); } @Around("pc1()") public Object around(ProceedingJoinPoint pjp) throws Throwable { return pjp.proceed(); } }
コードの説明:
@アスペクト アノテーションは、これがアスペクト クラスであることを示します
@ Pointcut() アノテーションは、ポイントカットを定義するためにメソッド pc1() で使用されます。実行中の最初の * はメソッドが任意の値を返すことを示し、2 番目の * はサービス パッケージ内の任意のクラスを示し、3 番目の * はクラス内の任意のメソッドを示し、括弧内の 2 つのドットはメソッド パラメータが任意であることを示します。ここでのエントリ ポイントは、サービス パッケージ内のすべてのクラスのすべてのメソッドです。
before() メソッドは、これが事前通知であることを示す @Before アノテーションを使用し、メソッドが実行されます。ターゲットメソッドの実装前。 JoinPoint パラメーターは、ターゲット メソッドに関する名前、修飾子、およびその他の情報を提供できます。
after() メソッドは、これが事後通知であることを示す @After アノテーションを使用し、メソッドターゲット メソッド内にあります。 実行後に実行します。
afterReturning() メソッドは @AfterReturning アノテーションを使用し、これがリターン通知であることを示します。ターゲット メソッドの戻り値は次で取得できます。この方法。 @AfterReturning アノテーションの戻りパラメータは、メソッドのパラメータに対応する戻り値の変数名を表します。結果の型はメソッド パラメーターで Object として定義されていることに注意してください。つまり、ターゲット メソッドの戻り値は任意の型にすることができます。結果パラメーターの型が Long の場合、メソッドは次の状況のみを処理できます。ターゲット メソッドの戻り値は Long
afterThrowing() メソッドは @AfterThrowing アノテーションを使用し、これが例外通知であること、つまりターゲット メソッドで例外が発生したことを示します。例外の種類が Exception である場合、すべての例外がこのメソッドで Executed に入ります。例外の種類が ArithmeticException の場合、ターゲット メソッドが ArithmeticException 例外をスローした場合にのみメソッドが開始されることを意味します。
この段落の書き直されたバージョン: @Around アノテーションが付けられた around() メソッドはサラウンド アドバイスと呼ばれます。サラウンド通知はすべての通知の中で最も強力な機能を持ち、事前通知、事後通知、例外通知、復帰通知を実装できます。ターゲット メソッドがサラウンド通知に入った後、ターゲット メソッドは ProceedingJoinPoint オブジェクトのプロシージャ メソッドを呼び出すことで実行を継続します。開発者はここでターゲット メソッドの実行パラメータ、戻り値などを変更し、ここでターゲット メソッドの例外を処理できます。 .
設定が完了したら、Controller でインターフェイスを作成し、Userservice の 2 つのメソッドをそれぞれ呼び出します。LogAspect のコードがターゲット メソッドに動的に埋め込まれていることがわかります。
getUserById メソッドが実行を開始します...
get...
getUserById メソッドの戻り値は次のとおりです: user
getUserById メソッドの実行が終了します...
deleteUserById メソッドが実行を開始します...
delete...
deleteUserById メソッドの戻り値は次のとおりです: null
deleteUserById メソッドの実行が終了します...
Spring Boot プロジェクトが開始されると、最初に静的リソース パスでホーム ページ ファイルとしてindex.html が検索されます。見つからない場合は、動的リソース パスが検索されます。 Index.html をホームページ ファイルとして使用します。
例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回逻辑视图名,如下:
@Controller public class IndexController { @RequestMapping("/index") public String index(){ return "index"; } }
运行项目,输入"http://localhost:8081",查看结果
favicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico
可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图
启动项目,查看效果
注意:清缓存,然后 Ctrl+F5 强制刷新
Spring Boot 中提供了大量的自动化配置类,在 Spring Boot 的入口类上有一个 @SpringBootApplication 注解。该注解是一个组合注解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成,其中 @EnableAutoConfiguration 注解开启自动化配置,相关的自动化配置就会被使用。要移除某个自动化配置,开发者可以按照以下方法进行相应的配置更改
@SpringBootApplication @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) public class Chapter04Application { public static void main(String[] args) { SpringApplication.run(Chapter04Application.class, args); } }
在 @EnableAutoConfiguration 注解中使用 exclude 属性去除 Error 的自动化配置类,这时如果在 resources/static/error 目录下创建 4xx.htnl、5xx.html ,访问出错时就不会自动跳转了。由于 @EnableAutoConfiguration 注解的 exclude 属性值是一个数组,因此有多个要排除的自动化配置文件只需要继续添加即可。另外一种配置方法是在 application.properties 文件中进行配置,示例如下:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
添加前
添加后
以上がSpringBoot の AOP と Web の統合を構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。