『互联网架构』软件架构-spring源码之spring AOP(
原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』软件架构-spring源码之spring AOP(十)
spring是一个技术体系,之前说过spring的ioc,学习底层的意义,为的是以后灵活进行定制的时候,学的底层知识就可以用了。之前我记得在开发的时候,log日志都是debug,到线上的时候为了不影响性能就改成info,但是如果是线上出问题了,需要关闭项目更改为debug,查看到底是怎么回事,其实如果学习了aop,里面有个开关的功能,可以动态的不更改项目状态的情况下,动态的让日志级别发生改变,灵活的追踪项目里面的存在的问题。
AOP
- 定义
当需要批量的定义程序逻辑,批量更改程序的时候,其实里面有很多坑,会让程序本身很复杂。有些人喜欢在AOP里面增加缓存,带来便利的同时也带来了复杂性。当代码变的扩展性强的时候,复杂性也变的非常强了。尤其是新手,慎重选择,尤其是负责性和扩展性上,做好真别。别让方案过于复杂。要用简单的方案实现复杂的问题,而不是是复杂的方案实现简单的问题。开发多年的领悟。
- 通知拦截组件
切入的具体逻辑载体。
- aop 定义组件
描述了aop具体包括哪些通知,具体切入到哪些方法。
- 调用执行组件
目标对象代理实现。
- java proxy
- cglib proxy
- 其他
- AopProxyBeanFactory
- AopProxy
流程梳理:首先会写一个aop拦截的逻辑组件,到底要拦截什么,具体的业务是什么,由AOP定义组件告诉我具体有哪些通知和拦截的组件,把它插入到哪些方法里面。具体的哪些方法执行是通过调用执行组件。由其他里面的aopbeanfactroy生成对应的aopproxy,用户拿到的就是业务服务类,达到的目的就是透明化。透明化的含义就是对用户来说调用者来说不需要关心这些,通过代理的方式把中间的方式不展示给用户来,就是透明化。AOP说实在的要不IOC复杂的很多。
AOP胡概念
-
连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为“在哪里干”;
-
切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为“在哪里干的集合”;
-
通知(Advice):在连接点上执行的行为,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知;在AOP中表示为“干什么”;
-
方面/切面(Aspect):横切关注点的模块化,比如上边提到的日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪干和干什么集合”;
-
引入(inter-type declaration):也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为“干什么(引入什么)”;
-
目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为“被通知对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为“对谁干”;
-
AOP代理(AOP Proxy):AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。
-
织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。
在AOP中,通过切入点选择目标对象的连接点,然后在目标对象的相应连接点处织入通知,而切入点和通知就是切面(横切关注点),而在目标对象连接点处应用切面的实现方式是通过AOP代理对象。
PS:AOP目前我用到的几个场景,就是日志管理,事务控制,权限管理 等几个。