一、aop的两大主要组件
- pointcut
pointcut即切点,决定对哪些方法进行增强 - advice
advice即通知,说明在切点处具体的动作,包括beforeAdvice、afterAdvice以及throwingAdvice。
还有一个就是advisor,通知器。它包括了切点和通知。
二、spring如何实现切面编程的?
在获取bean的时候,我们调用的是ProxyFactoryBean的getBean方法,spring在这个方法中封装了原对象的代理。
生成代理对象的方法主要有两种,一种是jdk动态代理另外一种就是cglib。
那么生成了代理对象之后如何进行拦截呢,针对于jdk动态代理和cglib我们分别进行分析:
- jdk动态代理
生成代理对象传入的参数:
Proxy.newProxyInstance(classLoader,interface,InvocationHandler)
当代理对象的方法被调用时,InvocationHandler的invoke方法作为回调函数被触发,在这个函数中完成对目标方法的调用及增强。
这里目标方法的调用是通过反射来实现的,增强即通过一系列拦截器实现的。
2.cglib
cglib与jdk基本相似,只不过它对目标方法的增强使用的是代理对象来完成的。而不是通过反射来完成的。
网友评论