一提到Spring,我的脑子里就闪现两个名词,一个AOP,一个是IOC,下面就让我将最近看spring技术核心内幕的心得跟大家分享分享。
首先上图一张。
AOP面向切面编程,之前一直都不理解什么叫做面向切面编程,咱们现实开发中经常用的是面向接口编程,突然来个这个还真是有点不知所云,随着项目的深入,现在回头来看这个面向切面编程还是挺好理解的。面向切面编程就是为了进一步实现解耦,使得程序可以在可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
advice:定义在连接点做什么,为切面增强织入接口
通知分为五中类型:
Before
在方法被调用之前调用
After
在方法完成后调用通知,无论方法是否执行成功
After-returning
在方法成功执行之后调用通知
After-throwing
在方法抛出异常后调用通知
Around
通知了好、包含了被通知的方法,在被通知的方法调用之前后调用之后执行自定义的行为
advice:定义在连接点做什么,为切面增强织入接口
通知分为五中类型:
Before
在方法被调用之前调用
After
在方法完成后调用通知,无论方法是否执行成功
After-returning
在方法成功执行之后调用通知
After-throwing
在方法抛出异常后调用通知
Around
通知了好、包含了被通知的方法,在被通知的方法调用之前后调用之后执行自定义的行为
切点(Pointcut):决定Adivice通知应该作用于哪个连接点
通知(advice)定义了切面何时,那么切点就是定义切面“何处” 描述某一类 Joint points, 比如定义了很多 Joint point, 对于 Spring AOP 来说就是匹配哪些方法的执行
advisor作为一个对象,将pointcut和advice两者组装起来。
其次图中需要说明的就是
JDK方式生成AopProxy:通过Proxy对象的invoke回调生成AopProxy
CGLIB方式生成AopProxy:主要是通过Enhance的callBack完成代理对象的生成
Spring中如何区分采用JDK动态代理和CGlib动态代理:
如果目标对象的实现类实现了接口,Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类;
如果目标对象的实现类没有实现接口,Spring AOP 将会采用 CGLIB 来生成 AOP 代理类
过滤器filter和拦截器的区别:
①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
AOP的知识小结到这里就结束了,欢迎各位来拍砖。