一、spring 切面的Advisor

顾问(Advisor) : 他将通知进行了包装,根据通知的不同类型,在不同的时间点,将切面织入到指定的目标对象的某些连接点(方法)。



PointCutAdvisor是顾问的一种,它是一个接口,有两个实现:

*

NameMatchMethodPointCutAdvisor

名称匹配方法 切入点顾问


详见appliactionContext.xml AdvisorTest.testBeforeAdvisor();



*

RegexpMethodPointCutAdvisor

正则表达式方法匹配切入点顾问


a: * 匹配前面的子表达式任意次 比如: ao* 能匹配 a ao aoo aoooooo


b: + 匹配前面的子表达式一次或者多次 比如: ao+ 能匹配 ao aoo aooo


c: . 匹配任意字符 除"\r\n"之外的


.* 代表任意的一个字符串 .*add.* 代表包含add字符的任意字符串


详见appliactionContext.xml , AdvisorTest.testAfterAdvisor();


因为上节中我们学习了advice通知,那么它也有缺点,比如,通知只能切入目标类的所有方法,不能指定某些方法,(那么我可以解决这个问题,通过顾问对通知的封装而实现.


注意aop的这个方法经典的方法在实际开发中很少用,但是对后面的xml配置以及AspectJ注解开发的理解非常有用


1.我们采用名称名称匹配的方法


首先创建一个applicationContext-advisor.xml的配置文件


spring中Advisor和Aspect区别_spring AOP的经典实现


创建测试方法


spring中Advisor和Aspect区别_生成器_02


结果:


spring中Advisor和Aspect区别_配置文件_03


也可以在配置文件中以数组的方式也可以得到同样的效果


spring中Advisor和Aspect区别_spring AOP的经典实现_04



2.通过正则表达式配置切入点顾问


同样配置applicationContext-advisorxml


spring中Advisor和Aspect区别_spring AOP的经典实现_05


测试方法


spring中Advisor和Aspect区别_xml_06


结果:


spring中Advisor和Aspect区别_xml_07


3.

Spring提供了自动代理生成器来解决要定义多个代理的问题 ,有如下两种方式:


DefaultAdvisorAutoProxyCreator

可代理所有Bean自动代理生成器


* 默认advisor自动代理生成器 (为配置文件里面所有的advisor自动生成代理)


详见AtuoProxyCreatorTest .java , appliactionContext.xml


注意:1 :为配置文件里面所有的advisor自动生成代理 /会代理配置文件里面所有注册的目标对象



BeanNameAutoProxyCreator

可选择某些切面自动代理生成器


* bean名称自动代理生成器


可以配置新的applicationContext-auto.xml


spring中Advisor和Aspect区别_Advisor_08


重新定义一个接口,IPersonDao,实现addStudent()和midify()方法,并注册该类


测试及结果:


spring中Advisor和Aspect区别_生成器_09


spring中Advisor和Aspect区别_Advisor_10


也可以为指定的bean配置代理生成器


spring中Advisor和Aspect区别_spring AOP的经典实现_11


在这是userDao的bean没有personDao的bean,我们一起来看看结果


spring中Advisor和Aspect区别_生成器_12


如果改为personDao则同理


spring中Advisor和Aspect区别_生成器_13


4.总结:


以上的各种技术无非就是,将我们编写的切面的实现(通知/顾问)织入到某些类的某些方法当中.


这些都是帮助理解AOP的思想,对我们后面的注解有较好的理解.

下节我们继续学习AOP的AspectJ基于注解的开发(前三节都是铺垫)