Spring_AOP:概念和底层原理

1.什么是AOP

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

(2)通俗表述:不通过修改源代码的方式,在主干功能中添加新功能

AOP底层原理

1.AOP底层使用动态代理

(1)有两种情况动态代理

  • 有接口情况,使用JDK动态代理

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

  • 没有接口情况,使用CGLIB动态代理

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

JDK 代理的实现:

1.使用JDK动态代理,使用Proxy

Class Proxy
       java.lang.Object
             java.lang.reflect.Proxy

调用newProxyInstance方法:

static Object	newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
                返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

方法有三个参数

第一个参数,类加载器

第二个参数,增强方法所在类,这个类实现的接口,支持多个接口

第三个参数,实现这个接口InvocationHandler,创建代理对象,写增强方法

 

2.JDK动态代理的代码

(1)创建一个接口,定义方法

接口 UserDao.java

package com.tinstu.spring.Jdk;
public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

(2)创建接口实现类,实现方法

实现类:UserDaoImpl.java

package com.tinstu.spring.Jdk;
public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        System.out.println("add方法执行了..");
        return a+b;
    }
    @Override
    public String update(String id) {
        System.out.println("update方法执行了");
        return id;
    }
}

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

package com.tinstu.spring.Jdk;

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

public class JDKProxy {
    public static void main(String[] args) {
        //创建接口实现类代理对象
        Class[] interfaces ={UserDao.class};
//new一个InvocationHandler的内部类
//        Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                return null;
//            }
//        });
        //new一个UserDaoProxy类
        UserDaoImpl userDao = new UserDaoImpl();
       UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
       int result = dao.add(1,2);
        System.out.println("result:"+result);

    }
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{
    //1 把创建的是谁的代理对象,把那个谁传递过来
    //通过有参数的构造传递
    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;
    }
}

 

 

阅读剩余
THE END