1.
AOP(アスペクト指向プログラミング)AOP(アスペクト指向プログラミング)は、「横断的」と呼ばれるテクノロジーを使用して、カプセル化されたオブジェクトの内部を分析し、複数のクラスに影響を与える一般的な動作を再利用可能なものにカプセル化します。アスペクトである「アスペクト」。いわゆる「アスペクト」は、単にビジネスとは関係のないロジックまたは責任ですが、カプセル化されたビジネスモジュールによって呼び出されます。これは、システムの反復コードを減らし、モジュール間の結合を減らすのに便利です。 、および将来の操作性と保守性を促進します。AOPは、「横断的」テクノロジーを使用して、ソフトウェアシステムを2つの部分に分割します。コアの関心事と横断的関心事です。ビジネス処理の主なプロセスは中心的な関心事であり、関連性の低い部分は横断的関心事です。横断的関心事の特徴は、それらが中心的な関心事の複数の場所で発生することが多く、許可認証、ログなど、基本的にどこでも類似していることです。AOPの役割は、システム内のさまざまな懸念事項を分離し、主要な懸念事項を横断的関心事から分離することです。
2. AOPの簡単な例:
最初にAOPアスペクトクラス(注釈付きフォーム)を記述します
package com.gx.aop;
import java.util.Date;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component //Spring注解
@Aspect //AOP切面注解
@Order(1) //设置优先级,正整数,数字越小,优先级越高
public class MyAopAspect1 {
private static final Logger logger = LoggerFactory.getLogger(MyAopAspect1.class);
//配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
//匹配com.gx.service包下所有的类的所有的方法
@Pointcut("execution(* com.gx.service.*.*(..))")
public void aspect(){
}
/**
* 前置通知, 在方法执行之前执行
* 使用在方法aspect()上注册的切入点
* @param joinPoint
*/
@Before(value="aspect()")
public void beforeMethod(JoinPoint joinPoint){
//获取目标的类名
String className = joinPoint.getTarget().getClass().getName();
//得到方法签名
String methodName = joinPoint.getSignature().getName();
logger.info("=======>>> beforeMethod*******"+className
+"("+methodName+") run start*******!");
}
/**
* 后置通知, 在方法执行之后执行
* 使用在方法aspect()上注册的切入点
* @param joinPoint
*/
@After(value="aspect()")
public void afterMethod(JoinPoint joinPoint){
//获取目标的类名
String className = joinPoint.getTarget().getClass().getName();
//得到方法签名
String methodName = joinPoint.getSignature().getName();
logger.info("=======>>> afterMethod*******"+className+"("+methodName+")*******!");
}
/**
* 后置返回通知, 在方法返回结果之后执行
* 使用在方法aspect()上注册的切入点
*
* AfterReturning增强处理可以访问到方法的返回值,但它不可以改变目标方法的返回值
* @param joinPoint
* @param objValue 方法返回值
*/
@AfterReturning(value="aspect()",returning="objValue")
public void afterReturningMethod(JoinPoint joinPoint,Object objValue){
//获取目标的类名
String className = joinPoint.getTarget().getClass().getName();
//得到方法签名
String methodName = joinPoint.getSignature().getName();
logger.info("=======>>> afterReturningMethon*******"+className
+"("+methodName+") Return="+objValue.toString()+"*******!");
}
/**
* 后置异常通知, 在方法抛出异常之后
* 使用在方法aspect()上注册的切入点
* @param joinPoint
* @param e
*/
@AfterThrowing(value="aspect()",throwing="e")
public void afterThrowingMethod(JoinPoint joinPoint,Exception e){
//获取目标的类名
String className = joinPoint.getTarget().getClass().getName();
//得到方法签名
String methodName = joinPoint.getSignature().getName();
logger.info("=======>>> afterReturningMethon*******"+className
+"("+methodName+") 出现异常----+"+e.getMessage()+"*******!");
}
/**
* 环绕通知, 围绕着方法执行
* 使用在方法aspect()上注册的切入点
* @param joinPoint
* @return
* @throws Throwable
*/
@Around(value="aspect()")
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable{
String metodName = joinPoint.getSignature().getName();
logger.info("aroundMethod<<<<<<<<method("+metodName+")startTime="+new Date()+">>>>>>>>");
//调用被切入的方法
Object object = joinPoint.proceed();
logger.info("aroundMethod<<<<<<<<method("+metodName+")endTime="+new Date()+">>>>>>>>");
return object;
}
}
MyAopAspect1はlog4jメソッドを使用するため、次に示すように、log4jjarパッケージと構成ファイルを追加する必要があります。applicationContext.xmlファイルで
AOPを構成します。
<!-- 开启注解 -->
<context:annotation-config />
<!-- 配置扫描路径, 去扫描有注解的包名-->
<context:component-scan base-package="com.gx.dao,com.gx.service,com.gx.aop" />
<!-- 自动为 spring容器中那些配置@Aspect切面的bean创健建代理,放入切面 -->
<aop:aspectj-autoproxy />
実行結果のスクリーンショットは次のとおりです。