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 指定需要切入的目标位置,切入点

-->

<aop:aspect ref="myLogger3" >

<aop:before method="fun1" pointcut-ref="p1"  />

<aop:after-returning method="fun2" pointcut-ref="p1" />

</aop:aspect>

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配置文件中注入需要被增强的业务对象,以及环绕增强类对象

 

<bean id="userService" class="com.service.UserService" ></bean>

 

<bean id="custService" class="com.service.CustService" ></bean>

 

<bean id="aroundLogger" class="com.aop.AroundLogger"></bean>

 

<!-- 设置增强的配置信息 -->

 

<aop:config>

 

<!-- 配置切入点: 被切入的对象 -->

<aop:pointcut expression="execution(* com.service.*Service.*(..))" id="p1"/>

 

<!-- 配置切面

ref 完成切面的对象bean的id

pointcut-ref 指定需要切入的目标位置,切入点

 

-->

 

<aop:aspect ref="aroundLogger">

<aop:around method="doListen" pointcut-ref="p1" />

</aop:aspect>

 

 

 

 

</aop:config>

 

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配置文件中注入需要增强的对象和增强对象

 

<bean id="userService" class="com.service.UserService" ></bean>

 

<bean id="custService" class="com.service.CustService" ></bean>

<!-- 开启spring自动代理功能:让所有AOP的注解生效 -->

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

<!-- 所有写有AOP注解的类必须配置在aop:aspectj-autoproxy下面 -->

<bean id="aroundLogger2" class="com.aop.AroundLogger2"></bean>

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值