• 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() + " 方法结束执行。");
            }
    
        }
    }
  • 相关阅读:
    JavaScript高级第01天笔记
    JavaScript基础第06天笔记
    JavaScript基础第05天笔记
    JavaScript基础第04天笔记
    JavaScript基础第03天笔记
    JavaScript基础第02天笔记
    JavaScript基础第01天笔记
    03-CSS文字文本样式
    CSS第二天笔记
    浮动
  • 原文地址:https://www.cnblogs.com/chuxuedejuzi/p/10905765.html
Copyright © 2020-2023  润新知