zoukankan      html  css  js  c++  java
  • Spring学习1_面向切面( AOP )实现原理

         面向切面编程 (Aspect Oriented Programming,简称AOP) 是Spring的一个重要特性,其原理是采用动态代理方式实现。

         下面通过一个Demo来模拟AOP实现

         整个代码目录结构如下:

         

           其中LogInterceptor类完成为所有Service方法添加日志记录的功能。

       1、Dao层实现

    package com.dao;
    
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void save() {
            System.out.println("excute save;");
            
        }
    
        @Override
        public void delete() {
            System.out.println("excute delete;");
            
        }
    
    }

        2、拦截器类实现 

    package com.handler;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    
    public class LogInterceptor implements InvocationHandler{
        
        private Object target;
        
        
        
        public void setTarget(Object target) {
            this.target = target;
        }
    
        public void beforMethod(Method method) {    
            System.out.println(method.getName() +"  start.");
        }
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            beforMethod(method);
            method.invoke(target, args);
            return null;
        }
    
    }

        3、AOP实际执行时是通过动态代理,对上述拦截器进行包装生成的代理类来完成切面功能的,测试如下:

    package com.test;
    
    import java.lang.reflect.Proxy;
    
    import org.junit.Test;
    
    import com.dao.UserDao;
    import com.dao.UserDaoImpl;
    import com.handler.LogInterceptor;
    
    public class TestAop {
    
        @Test
        public void testAopProxy() {
            UserDao userDao = new UserDaoImpl();
            LogInterceptor logInterceptor = new LogInterceptor();
            logInterceptor.setTarget(userDao);
            UserDao proxyDao = (UserDao) Proxy.newProxyInstance(userDao.getClass()
                    .getClassLoader(),  new Class[]{UserDao.class}, logInterceptor);
            proxyDao.save();
            proxyDao.delete();
        }
    }

       测试结果如下:

         

  • 相关阅读:
    LeetCode 542. 01 矩阵
    LeetCode 面试题 16.03. 交点
    LeetCode 151. 翻转字符串里的单词
    Markdown数学公式语法
    LeetCode 22. 括号生成
    LeetCode 146. LRU缓存机制
    LeetCode 面试题13. 机器人的运动范围
    LeetCode 48. 旋转图像
    LeetCode 84. 柱状图中最大的矩形
    LeetCode 42. 接雨水
  • 原文地址:https://www.cnblogs.com/toDjlPersonnalBlog/p/4651030.html
Copyright © 2011-2022 走看看