Spring的AOP初步了解(四)

来源:互联网 发布:装饰桌面的软件 编辑:程序博客网 时间:2024/06/04 18:01
Spring AOP的初步实现:
采用AspectJ实现AOP,它是基于java语言的AOP框架。
对于AspectJ的简单例子可以参考D:AOP,可以从反编译中看到,经过ajc 指令编译后,那些.class文件都发生了改变!也就是说AspectJ是编译时增强的AOP框架。
对于需要增强的类  采用aspect 关键字来定义类名。这里可以采用正则表达式的方式去匹配需要的方法名;


AOP的一些基本概念:
切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,所以也常常称为横切关注点。
连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出,Spring AOP中,连接点总是调用的方法。
增强处理(Advice):AOP框架在特定的切入点执行增强处理,有“around”、“before”、和“after”等类型。
切入点(Pointcut):可以插入增强处理的连接点,简而言之,当某个连接点满足指定的要求的时候,该连接点被添加增强处理,该连接点也就成了切入点。(一个过程)
引入:将方法或字段添加到被处理的类中。
目标对象:被AOP框架进行增强处理的对象。乳沟是通过运行时代理来实现的,那就是一个被代理对象。
AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象代理。

织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。有两种方式:编译时增强(例如AspectJ)和运行时增强(例如CGLIB).


Spring和其他纯Java AOP框架一样,在运行时织入。


Spring 有两种方式来定义切入点和增强处理:
基于Annotation的“零配置”:@Aspect、@Pointcut、等Annotation来标注
基于XML配置文件的管理,Spring配置文件来定义切入点、增强

Spring的“零配置”,需要对Spring的配置文件中加入:
<xmlns:aop=http://www.xxxx.xxxx.xxxx.schema/aop
http://www.springframework.org/schema/aop
……
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd>
<!—启动!@AspectJ支持 -->
<aop:aspectj-autoproxy/>

@Aspect标注一个java类,该java类将会作为切面Bean。
@Before :在切面类里面使用@Before来标注一个方法时,通常需要指定一个value属性值,该属性值指定一个切入点表达式(既可以是一个已有切入点,也可以直接定义切入点表达式),用于指定该增强处理将被织入哪些切入点。


例子:
@Aspect
Public class BeforeAdviceTest{
@Before(“ execution ( * org.crazyit.app.service.impl.*.*(…) )  ”)
}

@afterReturning(pointcut / value, returning )

@AfterThrowing(Pointcut/ value , throwing)

@After()

@Around()


基于XML配置文件的管理方式:
XML的优点:
适用于JDK1.5以前的版本
对早期的Spring用户更习惯
XML的缺点:
XML不能将切面、切入点、增强处理等封装到一个地方。查看这些的时候得从Java文件和XML中一起查看。
XML的配置方式比@AspectJ方式有更多的限制:仅支持“singleton”切面Bean,不能在XML中组合多个命名连接点的声明。

Spring的配置文件中,所有的切面、切入点和增强处理都必须定义在<aop:config……/>元素的内部。<beans……/>元素下可以包含多个<aop:config……/>元素,一个<aop:config……/>可以包含pointcut、advisor和aspect元素,且这三个元素必须按照此顺序来定义。关于<aop:config……/>元素所包含的元素:
pointcut、advisor、aspect

配置切面:
<aop:aspect ……/>元素有三个指定的属性:
Id:定义该切面的标识名。
Ref:指定以指定ref属性所引用的普通Bean作为切面Bean。
Order:指定该切面Bean的优先级,该属性的作用与前面@AspectJ中的@OrderAnnotatio Ordered一样,order属性值越小,优先级越高。
<aop:aspect  id=”afterAdviceAspect” ref=”afterAdviceBean” > ……

配置增强:
<aop:before ……/>
<aop:after ……/>
<aop:after-returning ……/>
<aop:after-throwing ……/>

<aop:around ……/>


它们的几个属性:
pointcut:该属性指定一个切入表达式,Spring将在匹配该表达式的连接点时织入该增强处理。
pointcut-ref:该属性指定一个已经存在的切入点名称,通常pointcut和pointcut-ref两个属性只需要其中的一个就行。
method:指定一个方法名,指定切面Bean的该方法将作为增强处理。
throwing:只对<after-throwing…/>有效,指定一个形参名,AfterReturning增强 可以通过该形参 访问目标方法所抛出的异常。

returning:该属性只对<after-throwing…/>有效,用于指定一个形参名,AfterReturning增强方法可以通过该形参访问目标方法的返回值。




0 0