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() + " 方法结束执行。");
        }

    }
}

 

posted on 2019-05-22 14:37  初学的橘子  阅读(131)  评论(0编辑  收藏  举报

导航