当前位置: 首页 > article >正文

【软件开发】Spring 面向切面编程(头歌作业)

第1关:使用前后置通知统计所有方法的执行时间

package Educoder;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import java.text.ParseException;

import java.text.SimpleDateFormat;

@Component("BlogAdvice")

@Aspect

public class BlogAdvice {

    //定义切点

    @Pointcut("execution(* Educoder.BlogService.service*(..))")

    public void My() {

    }

    //定义前置通知,输出当前时间2019.1.1 00:00:00

     /**********   Begin   **********/

    @Before("My()")

    public void before() {

        System.out.println("当前时间2019.1.1 00:00:00");

    }

     /**********   End   **********/

    //定义后置通知,输出当前时间2019.1.1 00:01:00,执行耗时60000

     /**********   Begin   **********/

     @After("My()")

    public void after() {

    System.out.println("当前时间2019.1.1 00:01:00,执行耗时60000");

    }

     /**********   End   **********/

}

第2关:使用环绕通知统计所有带参方法的执行时间 

package Educoder;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

import java.text.ParseException;

import java.text.SimpleDateFormat;

@Component("BlogAdvice")

@Aspect

public class BlogAdvice {

    //定义切点

    @Pointcut("execution(* Educoder.BlogService.service*(..))")

    public void My() {

    }

    //定义环绕通知,实现统计目标类所有带参方法运行时长

    @Around("My()")

    public void around(ProceedingJoinPoint point) throws ParseException, InterruptedException {

        /**********   Begin   **********/

        String startStr = "2019.1.1 00:00:00";

        String endStr = "2019.1.1 00:01:00";

         if(point.getArgs().length>0){

           SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

           long start = sdf.parse(startStr).getTime();

            try {

                point.proceed();

            } catch (Throwable throwable) {

                throwable.printStackTrace();

            }

           long end = sdf.parse(endStr).getTime();

           System.out.println("程序a执行耗时" + (end - start));

       }

        /**********   End   **********/

    }

}

 第3关:AOP实现原理-JDK动态代理

package educoder;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class MyProxy {

    public static  UserService createUserService(){

        //请在以下提示框内填写你的代码

         /**********Begin**********/

        //目标类

        UserServiceImpl userService = new UserServiceImpl();

        //切面类

        Authority authority = new Authority();

        //代理类:将目标类与切面类结合

         UserService proxyUserService1 = (UserService) Proxy.newProxyInstance(MyProxy.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {

        @Override

        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

            //执行目标方法前

            authority.before();

            //放行

            Object invoke = method.invoke(userService, args);

            //执行目标方法后

            return invoke;

          }

         });

        //返回代理对象

         return proxyUserService1;

       /**********End**********/

    }

}

第4关:AOP实现原理-CgLib动态代理

 package educoder;

import org.springframework.cglib.proxy.Enhancer;

import org.springframework.cglib.proxy.MethodInterceptor;

import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class MyProxy {

    public static  UserServiceImpl createUserService(){

         //请在以下提示框内填写你的代码

         /**********Begin**********/

        //目标类

        UserServiceImpl userService = new UserServiceImpl();

        //切面类

         Authority authority = new Authority();

        //cglib核心类

        Enhancer enhancer = new Enhancer();

        enhancer.setSuperclass(userService.getClass());

        enhancer.setCallback(new MethodInterceptor() {

        @Override

        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                //目标方法执行前

                authority.before();                

                //放行目标方法

                Object invoke = methodProxy.invokeSuper(o,objects);

                //目标方法执行后

                return  invoke;

            }

        });

       

        //获取代理对象

         UserServiceImpl proxy = (UserServiceImpl) enhancer.create();

        //返回代理对象

        return proxy;

        /**********End**********/

    }

}


http://www.kler.cn/a/392858.html

相关文章:

  • 【安全编码】Web平台如何设计防止重放攻击
  • VMware虚拟机超详细安装Linux教程(最新版)
  • 数据结构之线性表之顺序表
  • More Effective C++之技术Techniques,Idioms,Patterns_条款26-27
  • 后端接口设计
  • Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)
  • 小程序租赁系统打造便捷租赁体验助力共享经济发展
  • HO-PEG-MACA中PEG的修饰使其提高了稳定性,有助于其在各种溶剂中保持稳定的性能。
  • 冗余连接2 hard题 代随C#写法
  • 【数据结构】10.线索二叉树
  • 【Verilog】case、casex、casez的区别
  • MySQL中的事务与锁
  • opencv入门学习总结
  • 游戏服务器和普通服务器的区别
  • Shell编程之正则表达式与文本处理器
  • 游程编码 (Run-length Encoding)详细解读
  • 【go从零单排】Logging
  • uniapp中多角色导致tabbar过多的解决方式
  • 基于Python的自然语言处理系列(59):MultiRetrievalQAChain 实现
  • 基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 笔记本电脑定期保养
  • SwiftUI开发教程系列 - 第十二章:本地化与多语言支持
  • 贪心算法入门(二)
  • 【ROS的Navigation导航系统】
  • (附项目源码)Java开发语言,监督管家APP的设计与实现 58,计算机毕设程序开发+文案(LW+PPT)
  • 传奇996_19——常用函数