spring框架AOP实现知识点总结
1. AOP核心组件
1.1. 切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
1.2. 连接点(joinpoint):被拦截到的方法,字段或构造方法
1.3. 切入点(pointcut):对连接点进行拦截的定义
1.4. 通知(advice):拦截到连接点之后要执行的代码
1.5. 目标对象(target):代理的目标对象
2. AOP的5种增强处理类型
3. 使用XML配置方式实现前后置增强类记录日志
3.1. 使用jar包
3.2. 定义业务方法
3.3. 定义增强类
3.4. 配置log4J资源文件:
3.4.1. 设置记录日志的级别(fatal>error>warn>info>debug)
3.4.2. 设置日志输出的目标(console,file)
3.4.3. 设置日志输出的格式
3.4.4. 如果使用文件输出,需要设置日志文件的文件名
3.5. 配置spring的xml文件
3.5.1. 注入业务对象
3.5.2. 注入完成切入的增强对象
3.5.3. 设置AOP
3.5.3.1. 设置切入点pointcut:被切入的对象的范围
3.5.3.2. Execute表达式:指定需要被切入的方法的范围表达式
//com.service包下的以Service结尾的所有类的所有方法
execution(* com.service.*Service.*(..))
3.5.3.3. 设置切面(aspect):指定完成切入操作的增强类的方法,以及关联对应切入点
?
ref 完成切面的对象bean的id
pointcut-ref 指定需要切入的目标位置,切入点
-->
?
?
?
4. 环绕增强
4.1. 定义增强类
package com.aop;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
//环绕增强类:实现全程监控被切入方法的运行状态
public class AroundLogger {
Logger logger=Logger.getLogger(AroundLogger.class);
/**
* 在目标对象的方法执行前后进行增强操作,如果目标方法发生异常,由增强方法来处理
* @param point 连接点对象:拥有被切入对象的信息
* @return 被切入方法的返回值
*/
public Object doListen(ProceedingJoinPoint point){
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法即将执行,方法参数列表为:"+Arrays.toString(point.getArgs()));
Object result=null;
try {
//调用连接点对象的进程方法,让目标对象的业务方法执行
//该方法返回的是目标对象的被切入方法的返回值
result= point.proceed();
} catch (Throwable e) {
e.printStackTrace();
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法发生异常!异常信息为:"+e.getMessage());
result=0;
}finally{
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法执行完毕,方法参数列表为:"+Arrays.toString(point.getArgs())+";目标方法的返回值为"+result);
}
return result;
}
}
4.2. 在spring配置文件中注入需要被增强的业务对象,以及环绕增强类对象
?
?
?
?
?
?
?
?
ref 完成切面的对象bean的id
pointcut-ref 指定需要切入的目标位置,切入点
-->
?
?
5. 使用注解实现AOP
5.1. 定义注解方式的增强类
//环绕增强类:实现全程监控被切入方法的运行状态
//@Aspect 当前类为增强类
@Aspect
public class AroundLogger2 {
Logger logger=Logger.getLogger(AroundLogger2.class);
/**
* 在目标对象的方法执行前后进行增强操作,如果目标方法发生异常,由增强方法来处理
* @param point 连接点对象:拥有被切入对象的信息
* @return 被切入方法的返回值
*/
@Around(value="execution(* com.service.*Service.*(..))")
public Object doListen(ProceedingJoinPoint point){
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法即将执行,方法参数列表为:"+Arrays.toString(point.getArgs()));
Object result=null;
try {
//调用连接点对象的进程方法,让目标对象的业务方法执行
//该方法返回的是目标对象的被切入方法的返回值
result= point.proceed();
} catch (Throwable e) {
e.printStackTrace();
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法发生异常!异常信息为:"+e.getMessage());
result=0;
}finally{
logger.info(point.getTarget()+"对象的"+point.getSignature().getName()
+"方法执行完毕,方法参数列表为:"+Arrays.toString(point.getArgs())+";目标方法的返回值为"+result);
}
return result;
}
}
5.2. 在spring配置文件中注入需要增强的对象和增强对象
?
?
?
?
?
?
如果想学习Java性能优化,工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加下454377428群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。