AOP
业务需求:
1. 拦截所有业务方法
2. 判断用户是否有权限,有权限就允许他执行业务方法,没有权限则不允许他执行业务方法(是否有权限是根据user是否为null作为判断依据)
横切性关注点
AOP—代理对象(动态代理)
调用者------à代理对象------à目标对象
使用JDK中的Proxy类,要求目标对象必须实现某一接口
JDKProxyFactory
CGLIB(第三方生成动态代理的框架,不要求目标对象必须实现接口,Spring中有带)
环绕通知:
前置通知(目标方法执行前执行)
后置通知(目标方法执行后执行)
例外通知(捕获异常后执行)
最终通知(finally{}中执行)
AOP中的概念
Aspect(切面):横切面关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征,而切面是横切面关注点的抽象。
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。
Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义。
Advice(通知):所谓通知是指拦截到joinpoint后所要做的事情,通知分为前置通知、后置通知、异常通知、最终通知、环绕通知。
Target(目标对象):代理的目标对象。
Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入。
Introduction(引入):在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或field。
使用Spring进行面向切面(AOP)编程
要进行AOP编程,首先我们要在Spring的配置文件中引入aop命名空间
<xmlns:aop=“http://www.springframework.org/schema/aop”>
<xsi:schemaLocation=“http://www.springframework.org/aop
http://www.springframework.org/aop/spring-aop-2.5.xsd”>
Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:
l 基于XML配置方式进行AOP开发
l 基于注解方式进行AOP开发
必须的jar包:aspectjrt.jar、aspectweaver.jar、cglig-nodep-xxx.jar
基于注解方式声明切面
l 首先启动对@Aspect注解的支持:
<aop:aspectj-autoproxy/>
l 让Spring容器管理用注解方式声明的切面类(配置bean)
l 编写具体的切面类
基于XML配置方式声明切面
<aop:aspectj-autoproxy/>
<bean id=“aspectbean” class=“cn.itcast.service.MyInterceptor”>
<aop:config>
<aop:aspect id=“asp” ref=“aspectbean”>
<aop:pointcut id=“mycut” expression=“execution(* cn.itcast.service.impl.PersonServiceBean.*(..))”>
<aop:before pointcut-ref=“mycut” method=“”>
<aop:after-returning pointcut-ref=“mycut” method=“”>
<aop:after-throwing pointcut-ref=“mycut” method=“”>
<aop:after pointcut-ref=“mycut” method=“”>
<aop:around pointcut-ref=“mycut” method=“”>
</aop:config>