什么是AOP
1、什么是 AOP
(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
(3)使用登录例子说明 AOP
AOP底层原理
有两种情况动态代理
- 有接口的情况使用JDK动态代理
- 没有接口的情况,使用CGLIB
(1)有接口的情况使用JDK动态代理
创建接口实现类代理对象,增强类的方法
(2)没有接口情况,使用 CGLIB 动态代理
创建子类的代理对象,增强类的方法
JDK动态代理的实现
- Module java.base
- Package java.lang.reflect
- Class Proxy 详情请看
方法有三个参数:
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
步骤
(1)创建接口,定义方法
(2)创建接口实现类,实现方法
(3)使用 Proxy 类创建接口代理对象
- 有参构造方式传入被增强的对象
- invoke对象增强
- 代码
package com.LinXiaoDe.spring5;
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};
//1.类加载器
//2.增强方法所在的类,这个类实现的接口,支持多个接口
//3.实现这个接口 InvocationHandler,创建代理对象,写增强的部分
/*匿名内部类,可以写在内部
Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});*/
UserDaoImpl userDao=new UserDaoImpl();
UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,new UserDaoProxy(userDao));
int res=dao.add(1,2);
System.out.println("result: "+res);
}
}
//创建代理对象,实现InvocationHandler,用于增强
class UserDaoProxy implements InvocationHandler {
//1.把创建是谁的代理对象,那么把谁传进来
//有参构造方式传入
private Object obj;
public UserDaoProxy(Object obj)
{
this.obj=obj;
}
//2.只要对象被创建,那么方法将会被调用
@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;
}
}