Spring框架学习(第五讲)

AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象。

AOP的应用
在面向对象(OOP)的使用中,无可避免的会出现代码重复,而使用面向对象的变成方式这种重复无法避免。比如说在用户权限判断中,根据相应的权限执行相应的方法;在servlet中设置编码格式时同样相同的代码出现很多次,而且还跟业务无关,很容易忘记写,结果再运行时就会出现乱码。这种重复代码不仅使编码麻烦,而且还不容易维护。AOP的目的就是将这些代码整理起来,将解决某个切面问题的代码单独的放在某个模块中,然后再织入到程序中。

AOP中的相关概念术语
这里写图片描述
Aspect:横切面的功能,抽象出类,或接口,AOP编程重要的是识别出横切面功能。(比如类似字符编码功能)
Advice:横切面功能的具体实现,需要根据实际的情况分析,如果在目标对象操作之前是before,在操作之后就是after advice 。(类似于字符编码过滤器)
Pointcut:切入点,描述横切面功能应用的限制,不是所有的流程都需要,那些可以使用的地方就是切入点。(类似于过滤器的匹配规则 /*)
Joinpoint:连接点,或指组件加入流程的时机,比如设置属性,调用方法等,spring只支持方法调用的连接点,而其他的一些框架支持属性的连接点如:AspectJ。(类似于过滤器的过滤规则REQUEST,FORWARD)
Weave :缝合,将组件应用到业务流程中的这个过程叫缝合或者织入。(类似于将过滤器配置到web.xml文件的过程)
Proxy,代理,在实现上,spring的AOP其实就是使用JDK的动态代理(使用接口的方法完成代理操作),也可以使用CGLIB(使用继承的方式完成代理操作)。
Target:目标,业务操作的实际对象

上述我们只是从概念性以及相关术语介绍了AOP,下面我们通过具体的示例来加深理解。

1、AOP使用到的jar包
commons-logging.jar
spring.jar
acpectjrt.jar
aspectjweaver.jar
cglib-nodep-2.1.3.jar

2、Log类中定义两个方法 before()和after()
3、在userServiceImpl类中织入切面
4、配置文件:

<!--开启AOP功能-->
<aop:aspectj-autoproxy/>

<!--声明目标类-->
<bean id="userService" class="cn.test.service.impl.UserServiceImpl"/>
<!--声明扩展类-->
<bean id="log" class="cn.test.log.Log"/>

<!--织入扩展类,并声明在哪个方法上执行扩展类-->  
<aop:config>  
<aop:aspect id="extendAspect" ref="log">  
<aop:pointcut id="extendsPointcat"  expression="execution(* com.test.action.*.*(..))" />
<!--在目标方法执行前执行的方法-->  
<aop:before method="before" pointcut-ref="extendsPoincat" />  
<!--在目标方法执行后执行的方法-->  
<aop:after method="after" pointcut-ref="extendsPoincat" />  
</aop:aspect>  
</aop:config>

5、测试
成功的话,执行目标类中的目标方法时,会先执行扩展类中的before()方法,再执行目标方法,最后再执行after()方法。

也就是我们只需要手动调用目标方法,扩展类中的两个方法框架会在执行的时候通过读取配置文件,获取相应信息,自动给我们添加上扩展的方法。

Spring框架中使用AOP的优点

  • Aop与spring的IOC容器整合,增强,切入点都是javabean,可以在同一文件中配置
  • 和spring的其他部分一样,可以在不同应用服务器之间任意移植
  • Spring实现Aop的拦截接口,使得用户不必绑定在特定的拦截器接口上

    aop面向切面的编程思想,打破面向对象的思维方式,我们要学习的不仅是aop的使用,更要学习面向切面的这种思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值