Java-动态代理和AOP

代理:就是替代某事物的行为。

静态代理:代码写死的,编译时就知道了。代理类中持有被代理的对象引用,代理类中的方法实际调用被代理对象的方法,可在调用前后进行扩展。

动态代理:运行时才知道的,动态生成代理对象。分为jdk动态代理,cglib动态代理。

jdk动态代理:要求被代理对象有父接口。

                 api:proxy = Proxy.newInstance(被代理对象的类加载器,被代理对象的接口类集合,实现InvocationHanldler接口对象);

                 java底层就是通过被代理对象的类加载器和被代理对象的接口类集合使用反射技术获得构造器,通过构造器实例出代理对象

实际原理:就是通过三个参数去动态构造一个实现了被代理对象的父接口、持有实现InvocationHanldler接口对象的类对象。返回的就是生成好的代理对象,调用代理对象的方法,代理对象方法中实际去调用的就是实现InvocationHanldler接口对象中的重写的invoke方法。         

cglib动态代理:无需被代理对象有父接口,是通过生成被代理对象的子类实现对被代理对象的方法重写进行扩展的。实际原理略。

AOP:面向切面编程,底层原理就是通过动态代理技术实现的。

连接点:可以被增强的方法

切入点:需要被增强的方法

通知:增强的代码逻辑

切面:切入点和通知构成切面

织入:让切面生效的过程                                       

我们需要告诉框架:切面@Aspect,切入点@Pointcut("..."),通知@Before等。

切面类上需要@Coponent注解,表明该类需要被Spring创建和管理,框架就可以获取到切入点(哪些地方需要被增强)、增强方式。

具体过程:在IOC过程生成对象时,会根据切面类中的切入点表达式判断当前类是否需要生成代理对象。

                  拿到切入点表达式,就可以获取到被代理对象信息,可以通过判断被代理对象有无父接口采取不同的代理方式。

                  框架实际就会安装你配置的什么类什么方法生成对应的代理对象。

你可能感兴趣的:(我套你个猴子的java)