免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
この記事では、学生がまだわからない場合はAOPは、私がこの記事を書いたの前で見ることができるため、あまりにも多くのAOPの基本に巻き込ませずに春ブーツでAOPフォーカスを使用する方法について説明し春に詳細AOPを
1は、依存性を導入し、
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
我々はAOPの依存関係を導入した後、春ブーツが設定され、私たちを助けているので、それは、追加の設定は必要ありません。
2シンプルなコントローラを作成します。
package edu.szu.test.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
@RequestMapping("/end")
public String end() {
return "end";
}
}
3クラスのセクションを作成します。
クラスカットクラスになるために、あなたは注釈@Componentと@Aspectを追加しなければならない、ということここで注意してください。
package edu.szu.test.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
// 配置切点
@Pointcut("execution(* edu.szu.test.controller.*.*(..))")
private void point(){};
// 前置通知
@Before("point()")
public void doBefore(JoinPoint joinPoint){
//获取通知的签名
Signature signature = joinPoint.getSignature();
//获取代理方法
String name = signature.getName();
//获取代理类
String className = signature.getDeclaringTypeName();
logger.info("这是一个前置通知:" + "代理方法为" + name + " 代理类为" + className);
}
}
ここでは、edu.szu.test.controller下のすべての機能のためのカットオフポイントを定義します。
HTTPを入力するには、ブラウザを開き:// localhostを:8080 /こんにちは、その後、入力します。httpを:// localhostを:8080 /終了、次の結果を見つけました
4つのその他の通知
package edu.szu.test.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
// 配置切点
@Pointcut("execution(* edu.szu.test.controller.*.*(..))")
private void point(){};
// 前置通知
@Before("point()")
public void doBefore(JoinPoint joinPoint){
//获取通知的签名
Signature signature = joinPoint.getSignature();
//获取代理方法
String name = signature.getName();
//获取代理类
String className = signature.getDeclaringTypeName();
logger.info("这是一个前置通知:" + "代理方法为" + name + " 代理类为" + className);
}
// 环绕通知
@Around("point()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) {
//获取方法名
String name = proceedingJoinPoint.getSignature().getName();
logger.info("这是一个环绕通知:" + "代理方法为" + name);
try {
Object obj = proceedingJoinPoint.proceed();
logger.info("这是一个环绕通知:方法已被执行");
return obj;
} catch (Throwable throwable) {
throwable.printStackTrace();
logger.error("这是一个环绕通知:出错了!");
}
return null;
}
// 后置通知
@After("point()")
public void after(JoinPoint joinPoint) {
//获取通知的签名
Signature signature = joinPoint.getSignature();
//获取代理方法
String name = signature.getName();
//获取代理类
String className = signature.getDeclaringTypeName();
logger.info("这是一个后置通知:" + "代理方法为" + name + " 代理类为" + className);
}
// 后置返回通知,其中 keys 为返回值的信息
@AfterReturning(value = "point()",returning = "keys")
public void afterReturning(JoinPoint joinPoint,Object keys){
logger.info("这是一个后置返回通知:返回值为" + keys.toString());
}
// 后置异常通知
@AfterThrowing(value = "point()",throwing = "exception")
public void afterThrowing(JoinPoint joinPoint,Throwable exception){
//获取通知的签名
Signature signature = joinPoint.getSignature();
//获取代理方法
String name = signature.getName();
logger.error("这是一个后置异常通知:" + "代理方法为" + name);
logger.error("这是一个后置异常通知:" + exception);
}
}
それについてのアドバイスや話の周りに、これはアドバイスの中で最も強力なものです。アドバイスは、メソッド呼び出しのカスタム動作の前または後に行うことができるの周りには、接続ポイントを続行するか、直接バック独自の戻り値または例外の実行を投げするかどうかを選択、あるいは実行メソッドのパラメータと実行を置き換えるかどうかを決定します完了は、戻り値を交換する必要があります。ProceedingJoinPointコール進む()メソッドは、実行の基本的な方法になります。
5テスト
通常のコントローラをテストする最初の
@RequestMapping("/hello")
public String hello() {
//int i = 1/0;
return "hello";
}
結果は以下の通りであり
、次いで、故意コントローラにスロー
@RequestMapping("/hello")
public String hello() {
int i = 1/0;
return "hello";
}
結果は以下の通りであります