aop难点解析。

静态织入和动态织入的区别?正则表达式

需求示例:假设有一个包,一个包当中有一个方法,咱们想在这个方法的先后,加上环绕。函数

那么怎么加呢?性能

把知道的都说一遍。代理

1.创建JsonService日志

2.创建JSONASPECT,这个类是一个Bean,它使用了@Aspect接口

3.写XML文件。get

3.1静态织入 (好处就是:编译的时候织入,无性能压力)虚拟机

3.2 动态织入it

问:动态织入比静态织入灵活在哪一个地方?io

若是是动态织入,那么是运行时,。。。不晓得怎么回答。

好比JointPoint(拦截点吧),何时拦截,靠什么东西拦截,何时能够触发拦截点,这些拦截点有没有什么规律?

Join Point能够是任何点,那么对应Aop的织入点又是什么意思呢?

那就要考虑到pointCut了,AOP的pointCut的粒度是方法,对于一个方法,可能有不少的aspect.

还有一个问题是:PointCut的正则表达式怎么写?

答:

 

SPRING动态代理有哪些?cglib和jdk动态代理。

区别:JDK动态代理,须要建立接口,可是cglib不须要。

JDK动态代理:Proxy.newProxyInstance(targetAspectClass);(问:为何能够这么作?)

aop包括静态织入和动态代理,动态代理又分为jdk代理和cglib代理,

pointcut正则表达式的写法:

有三种,一种是execution,一种是annonation,一种是within(这种TMD还没研究过的!!!)

就拿execution来讲吧,首先是 * * public ..(..)<---xxxx又忘记鸟。

你能给我演示一下静态织入吗?

编译时织入,利用的是ASPECTJ的特性去织入。

那什么是动态织入呢?

利用JDK代理,Proxy类里面的newProxyInstance去进行织入。

这个类必须实现InvocationHandler,而后里面有一个CreateNewInstance方法,而后这个类里面还有一个invoke方法,这个里面又包含了一个invoke方法,里层的invoke方法,实际上是虚拟机去调用的,也就是和JVM有关的,它调用先后就是一个JointPoint process.proceed()方法,调用这个东西,其实就是完成了这个方法,在before和after这个方法的先后,就会记录日志。

问:aspect和advisor有什么区别?不知道!!!!

问个问题,cglib代理和jdk代理的区别。

 jdk动态代理的invoke方法何时会被调用?

我总算是弄明白了,原来这和InvokationHanlder接口里面的实现类的构造函数有关系,构造函数里面用不只会初始化父类的构造函数,还会把当前代理类所关联的类一并注入进去。

在newProxyInstance方法里面,其实生成的是一个带有InvocationHanlder功能的一个代理类,你所使用的真实方法当中的INVOKE方法,会在你调用真实方法的时候,转换成这个INVOKE方法,也就是说你调用了a方法,其实并非调用的A方法,

而是调用的invoke方法,A方法只是做为一个参数,被传递到了INVOKE里面,真正调用A方法的时候,是在内层的一个.invoke的一个反射方法的时候去调用,这样就实现了AOP日志处理。

相关文章
相关标签/搜索