您的位置:首页 > 编程语言 > Java开发

Spring的AOP初步了解(四)

2015-05-05 17:14 246 查看
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增强方法可以通过该形参访问目标方法的返回值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: