zoukankan      html  css  js  c++  java
  • spring AOP

    静态代理与动态代理

    静态代理

    /*
     *   created by why on 2020/3/1
     *
     * 代替UserServiceImpl代理 额外功能
     * 静态代理类
     *      1>  要和目标保持功能一致 : 和目标保持同一套接口
     *      2>  组成:目标 + 额外功能
     */
    
    import com.baidu.pojo.User;
    
    public class UserServiceProxy implements UserService{
        //原始业务:目标
        private UserService userService = new UserServiceImpl();
    
        public Integer insertUser(User user) {
            System.out.println("额外功能");
            return userService.insertUser(user);
        }
    
        public User queryOne(Integer id) {
            System.out.println("额外功能");
            return userService.queryOne(id);
        }
    }
    

    动态代理

        //动态代理搭建
            //1.目标
            final UserService userService = new UserServiceImpl();
            //2.额外功能
            InvocationHandler ih = new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       //一个回调函数
                    System.out.println("额外功能");
                    method.invoke(userService,args);
                    return null;
                }
            };
            //3.组装,编制
            //利用反射机制(动态生成反射出来的类),调用目标和额外,额外生成一个代理类
            UserService proxy = (UserService) Proxy.newProxyInstance(AppTest.class.getClassLoader(),
                    userService.getClass().getInterfaces(),ih);
            proxy.queryOne(1);
            System.out.println("--------");
            proxy.insertUser(new User());
    

    动态代理与AOP

    动态代理的实现方案

    1.jdk代理:(JDK在反射包中提供的一套api,上面的例子)通过和目标实现相同的接口保证功能的一致性
    2.cglib代理:(第三方cglib库中的一套api)通过继承目标保证功能的一致性

    spring aop

    底层采用了如上的两种代理,并对动态代理提供了简单的,可操作强的决绝方案。
    目标有接口吗?->有->用jdk代理,否则用cglib代理

    切面:Aspect,由切入点额外功能组成。
    一种新的编程角度:由 切面目标 形成代理。解决项目中的额外功能冗余的问题。

  • 相关阅读:
    Java基础系列(3)- 程序流程控制
    Linux 文本处理三剑客
    POJ3592 Instantaneous Transference题解
    插入排序的优化非希尔【不靠谱地讲可以优化到O(nlogn)】 USACO 丑数
    BZOJ2818 与 BZOJ2301【euler,线性筛,莫比乌斯】
    BZOJ1857 传送带 (三分法求单峰函数极值)
    线段树详解
    二叉查找树 详解
    最小函数值 洛谷P2085
    二叉树的遍历转换(层序,中序转先序)
  • 原文地址:https://www.cnblogs.com/whyaza/p/12392107.html
Copyright © 2011-2022 走看看