spring的aop学习(1)
增强方法:
package aop; import java.util.Arrays; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; public class UserServiceLogger { private static final Logger log = Logger.getLogger(UserServiceLogger.class); /** *UserServiceLogger.java 切面前后执行的方法 * JoinPoint方法: * .getTarget() 得到被代理的目标对象 * .getSignature() 返回被代理的目标方法 * .getArgs() 返回传递给目标方法的参数数组 * @param jp */ public void before(JoinPoint jp) { log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs())); } public void afterReturning(JoinPoint jp, Object result) { log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法返回值:" + result); } }
applicationContext.xml文件(Spring)的配置文件:
<!--appliactioncontext.xml即spring的配置文件配置关于切面切点--> <!-- 声明增强方法所在的Bean --> <bean id="theLogger" class="aop.UserServiceLogger"></bean> <!-- 配置切面 --> <aop:config> <!-- 定义切入点:PointCut --> <aop:pointcut id="pointcut" expression="execution(public void addNewUser(entity.User))" /> <!-- 引用包含增强方法的Bean --> <aop:aspect ref="theLogger"> <!-- 将before()方法定义为前置增强并引用pointcut切入点 --> <aop:before method="before" pointcut-ref="pointcut"></aop:before> <!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点 --> <!-- 通过returning属性指定为名为result的参数注入返回值 result 返回值和方法的返回值有关--> <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result" /> </aop:aspect> </aop:config>
以上就是最基本的增强方式,springAop就是再不改变原有程序的情况下为代码添加新的功能,对其进行增强处理,上两图是为目标方法前后提供了日志功能。
环绕增强:功能最强大的处理能实现 前+后+异常抛出+最终增强
<!-- 声明增强方法所在的Bean --> <bean id="theLogger" class="aop.AroundLogger"></bean> <!-- 配置切面 --> <aop:config> <!-- 定义切入点 --> <aop:pointcut id="pointcut" expression="execution(* service.UserService.*(..))" /> <!-- 引用包含增强方法的Bean --> <aop:aspect ref="theLogger"> <!-- 将aroundLogger()方法定义为环绕增强并引用pointcut切入点 --> <aop:around method="aroundLogger" pointcut-ref="pointcut"/> </aop:aspect> </aop:config>
package aop; import java.util.Arrays; import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; /** * 定义包含增强方法的JavaBean */ public class AroundLogger { private static final Logger log = Logger.getLogger(AroundLogger.class); public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs())); try { Object result = jp.proceed(); log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法返回值:" + result); return result; } catch (Throwable e) { log.error(jp.getSignature().getName() + " 方法发生异常:" + e); throw e; } finally { log.info(jp.getSignature().getName() + " 方法结束执行。"); } } }