• Java动态代理模拟spring的AOP


          广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者咨询。

      spring中的AOP是通过Java的动态代理实现的,有关动态代理的详细解释参见:

      现在就使用Java的动态代理模拟AOP(使用JDK的动态代理)

      1.建立实体对象

      public class User {

      Integer id;

      String name;

      String pwd;

      public User() {

      }

      public User(int id, String name, String pwd) {

      this.id = id;

      this.name = name;

      this.pwd = pwd;

      }

      //setter/getter

      }

      2.建立接口

      public interface UserDao {

      public void addUser(User user);

      }

      3.实现接口

      public class UserDaoImpl implements UserDao{

      @Override

      public void addUser(User user){

      System.out.println("保存User到数据库中");

      throw new RuntimeException();

      }

      }

      4.创建拦截器(这个类就相当于aop中的切面类)

      public class MyInterceptor implements InvocationHandler {

      private Object target;

      public MyInterceptor() {

      }

      public MyInterceptor(Object target) {

      this.target = target;

      }

      public Object getTarget() {

      return target;

      }

      public void setTarget(Object target) {

      this.target = target;

      }

      public void before() {

      System.out.println("这是一个前置通知");

      }

      public void afterReturning() {

      System.out.println("这是一个后置通知");

      }

      public void afterThrowing() {

      System.out.println("这是一个异常通知");

      }

      public void after() {

      System.out.println("这是一个最终通知");

      }

      @Override

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

      Object returnValue = null;

      try {

      before();

      returnValue = method.invoke(target, args);

      afterReturning();

      } catch (Exception e) {

      afterThrowing();

      } finally {

      after();

      }

      return returnValue;

      }

      }

      5.通过代理对象实现目标方法

      @Test

      public void testAOP() {

      UserDao userDao = new UserDao();

      MyInterceptor interceptor = new MyInterceptor();

      interceptor.setTarget(userDao);

      //通过代理的静态方法创建一个代理对象

      //这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个

      方法。

      //因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型

      UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(),

      userDao.getClass().getInterfaces(),

      interceptor);

      //然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上

      userDaoProxy.addUser(new User(1, "a", "b"));

      }

      6.程序输出

      这是一个前置通知

      保存User到数据库中

      这是一个异常通知

      这是一个最终通知

      疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!疯狂java培训中心地址:广州天河区车陂沣宏大厦3楼。

      疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。疯狂软件开设了java课程,ios课程,android课程,为你提供一个学习java技能的好机会,疯狂软件特大优惠活动,加疯狂软件微信号(疯狂软件),抢优惠,优惠100元+赠送iOS教材一本 详情请看疯狂java培训官网。IT从业着仍是社会所需要的高端人才,广州疯狂软件之力于培养企业所需要的中高端IT人才,让你成为备受企业青睐的人才。

  • 相关阅读:
    亚马逊产品图片爬取
    页面浏览统计之(一) hitcount
    页面浏览统计之(二) tracking
    页面浏览统计之(三) tracking2
    Django CMS apphooks – 使用应用钩子来添加主题应用
    Django CMS 插件 – 添加博客专题
    [整理] Windows下打印网页
    CompletableFuture详解
    详解JVM常量池、Class、运行时、字符串常量池
    分库分表总结
  • 原文地址:https://www.cnblogs.com/gojava/p/3498977.html
Copyright © 2020-2023  润新知