spring是一个技术体系,以前说过spring的ioc,学习底层的意义,为的是之后灵活进行定制的时候,学的底层知识就能够用了。以前我记得在开发的时候,log日志都是debug,到线上的时候为了避免影响性能就改为info,可是若是是线上出问题了,须要关闭项目更改成debug,查看究竟是怎么回事,其实若是学习了aop,里面有个开关的功能,能够动态的不更改项目状态的状况下,动态的让日志级别发生改变,灵活的追踪项目里面的存在的问题。java
AOP
-
定义正则表达式
当须要批量的定义程序逻辑,批量更改程序的时候,其实里面有不少坑,会让程序自己很复杂。有些人喜欢在AOP里面增长缓存,带来便利的同时也带来了复杂性。当代码变的扩展性强的时候,复杂性也变的很是强了。尤为是新手,慎重选择,尤为是负责性和扩展性上,作好真别。别让方案过于复杂。要用简单的方案实现复杂的问题,而不是是复杂的方案实现简单的问题。开发多年的领悟。spring
-
通知拦截组件缓存
切入的具体逻辑载体。架构
-
aop 定义组件框架
描述了aop具体包括哪些通知,具体切入到哪些方法。ide
-
调用执行组件模块化
目标对象代理实现。性能
- 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目前我用到的几个场景,就是日志管理,事务控制,权限管理 等几个。