西安做网站公司哪家好 应该怎么选择,企业网站有什么,四川城乡建设部网站,机械外贸网站建设0、基础知识 AOP我们知道#xff0c;是在不修改源代码的情况下#xff0c;为代码添加一些新功能的技术。通过动态代理#xff0c;可以在不修改原始类代码的前提下#xff0c;对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下#xff0c;对方法…0、基础知识 AOP我们知道是在不修改源代码的情况下为代码添加一些新功能的技术。通过动态代理可以在不修改原始类代码的前提下对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下对方法的调用进行额外的处理比如日志记录、性能监控、事务管理等。它实现了面向切面编程AOP的核心概念。
1、动态代理 AOP其实就是先通过“一些办法”拿到“代理对象”再对这个代理对象添加新方法。
动态代理的两种办法
1.1 JDK代理基于接口的动态代理技术。 方法通过目标接口创建接口实现类动态地在运行时内存里生成代理对象其拥有目标对象的原方法实现最后通过代理对象来增加新功能。 看文字有些抽象现在手动用代码实现一个JDK代理的AOP技术根据jdk1.8手册找到Proxy类通过newInstance方法实现动态代理对象的创建。 “Proxy提供了创建动态代理类和实例的静态方法它也是由这些方法创建的所有动态代理类的超类。” 1准备接口和实现类
//接口
public interface UserDao {public int add(int a,int b);public String update(String id);
}//实现类
public class UserDaoImpl implements UserDao{Overridepublic int add(int a, int b) {System.out.println(add.......);return ab;}Overridepublic String update(String id) {System.out.println(update);return id;}
}
2创建UserDao的代理对象调用增强方法 需要注意InvocationHandler接口里有invoke方法必须实现而调用代理对象的任何方法实质都是在执行invoke方法。
public class JDKProxy {public static void main(String[] args) {
/**
newProxyInstance的三个内容类加载器、要实现的接口的class、
和InvocationHandler这是个接口里面写的增强类的具体逻辑
*/Class[] interfaces {UserDao.class};UserDaoImpl userDao new UserDaoImpl();UserDao dao (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));//生成的“dao”就是代理对象实例。//也可以直接用匿名内部类的方法来写(new InvocationHandler)int add dao.add(1, 2);//使用代理对象dao调用add的时候无需改变add源码却增强了功能。System.out.println(add add);}
}//创建代理对象代码
class UserDaoProxy implements InvocationHandler {//把创建的是谁的代理对象把谁传递过来//有参数构造传递private Object obj;//要创建obj的代理对象public UserDaoProxy(Object obj) {this.obj obj;}//增强的逻辑InvocationHandler接口里有invoke方法必须实现
//调用代理对象的任何方法实质都是在执行invoke方法。Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前增强System.out.println(方法之前执行....method.getName() :传递的参数... Arrays.toString(args));//被增强的方法执行原模块功能不变Object res method.invoke(obj, args);//res3//方法之后增强System.out.println(方法之后执行....obj);return res;}
} 但是有个遗留问题invoke函数究竟是如何被调用的往下看了源码也没有分析出来个人推测是这样的 因为传入的obj其实就是要动态代理的原对象但我们不知道具体执行什么方法此时dao还未调用add方法。但调用了以后invoke方法却能够自动调用、增强方法内部应该是采用反射的方法拿到“add”这个方法名称通过getMethod反射出方法的类对象再用method.invoke(具体对象)来实现方法的调用从而调用add并完成前后的增强。
1.2 cglib基于父类的动态代理技术。 方法为目标对象动态地生成子对象其具有了父类的方法实际不是继承 实现类似此处不做代码示例。