十一、AOP - 基本概念

1. 什么是AOP?

        1. 面向切面编程,利用 AOP 可以对业务逻辑的哥哥部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。

        2. 在不改变原有代码的情况下,在主干功能里添加新功能。

3. 通过登录的例子

 2. AOP 底层原理

        1. AOP底层使用动态代理

                第一种 有接口情况,使用 JDK 动态代理

创建接口实现类代理对象,增强类的方法。

  

                第二种 没有接口情况,使用 CJLIB的动态代理

创建子类的代理对象,增强类的方法。

 3. AOP (JDK 动态代理)

         1.  调用 newProxyInstance 方法

        方法中有三个参数:

                1. ClassLoader  类加载器

                2.  <?>[] interfaces 增强方法所在类,这个类实现的接口,支持多个接口

                3. InvocationHandler 实现这个接口,创建代理对象,写增强的方法。

        2. JDK 动态代理代码

                1. 创建 dao 对象

package com.study.modules.proxy.dao;

/**
 * UserDao.
 *
 * @author lipw
 * @since 2021/12/4 10:40
 */
public interface UserDao {

    public int add (int a, int b);

    public String update(String id);
}

                2. 创建dao实现类

package com.study.modules.proxy.dao;

/**
 * UserDaoImpl.
 *
 * @author lipw
 * @since 2021/12/4 10:40
 */
public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        return a + b;
    }

    @Override
    public String update(String id) {
        return id;
    }
}

                3. 使用Proxy 类创建接口代理对象

package com.study.modules.proxy;

import com.study.modules.proxy.dao.UserDao;
import com.study.modules.proxy.dao.UserDaoImpl;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * JDKProxy.
 *
 * @author lipw
 * @since 2021/12/4 10:44
 */
public class JDKProxy {
    public static void main(String[] args) {
        // 创建接口实现类代理对象
        Class [] myInterfaces = {UserDao.class};

        /*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), myInterfaces,
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });*/
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        UserDao dao =
                (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),
                        myInterfaces,
                new UserDaoProxy(userDaoImpl));

        int result = dao.add(1, 2);
        System.out.println(result);
    }

    // 创建代理对象代码
    static class UserDaoProxy implements InvocationHandler {
        // 创建是谁的代理对象, 把谁就传递过来
        private Object obj;

        public UserDaoProxy(Object obj) {
            this.obj = obj;
        }

        // 增强的逻辑
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

            // 方法之前
            System.out.println("方法之前执行……" + method.getName() + ": 传递的参数……" + Arrays.toString(args));
            // 被增强的方法执行
            Object res = method.invoke(obj, args);
            // 方法之后
            System.out.println("方法之后执行……" + obj);
            return res;
        }
    }

}

3. AOP (术语)

        1. 连接点

                类里面哪些方法可以被增强,这些方法称为连接点。

        2. 切入点

                实际被增强的方法,称为切入点。

        3. 通知(增强)

                1. 实际 增强的逻辑部分被称为通知(增强)

                2. 通知有多种类型

                        前置通知

                        后置通知

                        环绕通知

                        异常通知

                        最终通知 (finally)

        4. 切面

                是动作

                        1. 把通知应用到切入点的过程。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值