概述
实现aop(这里只实现xml配置的方式)
1.实现的两种方式
在运行期实现aop法1:继承。客户端持有的是父类,实际上运行的是动态生成继承客户端待增强持有类的子类。(用到CGLib技术,用字节码生成一个子类)
在运行期实现aop法2:接口实现。若客户端实现类实现了一个接口,则可以在此接口下再写一个动态生成的实现类。(若客户端实现类为final类则无法用法1继承,只能用法2)(Java动态代理,同样可以用字节码生成一个子类)
2.在xml中aop的配置
关于aop中一些专业术语的说明:
- 切面(Aspect) :官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例 如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext 中<aop:aspect>来配置。
- 连接点(Joinpoint) :程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者BServiceImpl.barB(String _msg, int _type)抛出异常等行为。
- 通知(Advice) :“切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如TestAspect
- 切入点(Pointcut) :匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(* com.spring.service.*.*(..))来决定。
解析pointcut:在Spring中提供了两个接口,并用AspectJExpressionPointcut来实现这两个接口。
解析method:在Spring中提供了MethodLocatingFactory,getObject()方法返回的即是这个Method。
3.实现指定次序的链式调用
Spring定义的拦截器
实现按顺序调用的类和方法
4.实现AOP与CGLib的结合,得到aop的动态代理
5.从XML中创建BeanDefinition
之前的Bean定义是非常简单的,而现在增加了aop之后的bean定义变得非常复杂,拿aop:before来举例,它其中有ref和method两个属性,spring的处理方法是,pointcut和method都分别作为一个类,从而我们现在要解决“类中类”的解析。
对于before标签实体类的创建,spring通过特定的构造器来创建,但出现了构造方法中类的类型不匹配的问题
spring的解决方法:把构造方法作修改,第三个advice...Factory的类型修改成AspectInstanceFactory,而第一个保持不变。但是MethodLocatingFactory要继承FactoryBean,而FactoryBean它的作用是专门用来生成对象的(下面的getObject()方法),因此,在获得MethodLocatingFactory类型的Bean时,会再生成一个Method类型的对象与构造函数匹配。
中间经过一系列对Bean的解析,最终得到了Bean的定义,最后一步是要得到Bean的对象。在对Bean初始化之后调用BeanPostProcessorafterinitialization(),创建“代理”。
经过上述操作,实现给定一个AopConfig,使用CGlib生成一个对象的动态代理。
最后
以上就是积极微笑为你收集整理的spring课程学习——第6课的全部内容,希望文章能够帮你解决spring课程学习——第6课所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复