一个AOP的“拦截”,基本包含
三个方面:
1、切入点 pointcut :现象pointcut接口的public ClassFilter getClassFilter()【返回一个实现了ClassFilter.match方法的类】,public MethodMatcher getMethodMatcher()方法【返回一个实现了MethodMatcher.match方法的类】
2、增强设计 Advice : 实现MethodInterceptor接口的public Object invoke(MethodInvocation methodInvocation)方法,methodInvocation.proceed()则反射为target的方法执行。
3、通知器 Advisor :把pointcut和Advice结合起来(作为Advisor的属性)
在AOP的实现中,使用的主要技术是动态代理(ProxyFactoryBean)。
代理方式:常见两种 JDK的proxy方式或者是CGLIB方式
配置:
配置一个proxyFactoryBean需要设定
target(目标代理对象)和interceptorNames(通知器)。还有proxyInterface(目标代理对象的接口类)。
实现的过程:
代理会生成一个接口和目标代理对象target一致的代理对象proxy,它同样实现了target的方法doSomething。
这样对目标对象的调用,就被代理对象“浑水摸鱼”给拦截处理,
然后根据配置的属性Before、After、Around,对方法进行处理。
preOperation+doSomething+postOperation
代码流程:
proxyFactoryBean通过getBean生产上述的bean。
getBean中(区分singleton和prototype形式),首先对通知器链进行初始化,装载通知器(getBean的形式)