Spring2.X中AOP的使用浅析

Spring2.X中AOP的使用浅析,第1张

Spring2.X中AOP的使用浅析,第2张

与Spring1相比。x,春天2。x使用AspectJ语法来声明AOP,这使得它更加“标准”和灵活。还是那句话,如果你不懂AspectJ,打算用Spring2的AspectJ风格的AOP。x,学AspectJ。这方面的书还有很多。

Spring2下实现刻面有两种方式。x,一种是在Java文件中定义刻面(只是普通的Java类),然后在配置文件中声明定义的刻面;另一种是在Java类中引入与AOP相关的元数据(注释)。

首先介绍一下第一种配置方式。需要指出的是,Spring2的beans名称空。x与Spring 1.x不同,它采用Schema而不是DTD(或者DTD,具体请参考文档)。或者引入无意义的日志方面。已定义的方面类LogingAspect如下所示:

public class log in SPECT {
public void log method(join point jp){
system . err . println(jp . get target()。getClass());
system . err . println(jp . get signature()。getName());
}
}

同时,在配置文件中配置以下内容:

< bean id = " logAspectTarget " class = " hibernate sample . service . util . logingaspect " >

< AOP:config >
< AOP:aspect id = " logAspect " ref = " logAspectTarget " >
< AOP:pointcut id = " business service " expression = " execution(* hibernate sample . service . *。*(..))"/>
< AOP:after pointcut-ref = " business service " method = " log method "/>

对于上述方面,切入点businessService是在配置文件中声明的,其表达式采用AspectJ语法。根据配置文件信息,LogingAspect类中的logMethod(JoinPoint jp)方法可以称为after notification,该方法的JoinPoint参数不是必需的。它来自AspectJ的实用类,在这里用来输出一些与连接点相关的信息。当然,在春天。x,切入点和通知可以更灵活的使用,我们可以像AspectJ一样传递参数给通知。如果您需要在服务中引入事务功能,您需要按如下方式配置事务通知:

< tx:advice id = " tx advice " transaction-manager = " transaction manager " >
< tx:attributes >
< tx:method name = " get * " read-only = " true "/>
< tx:method name = " find * " read-only = " true "/>
< tx:method name = " * "/>


< AOP:config >*(..))"/>
< AOP:advisor advice-ref = " tx advice " pointcut-ref = " demoServiceMethods "/>
< AOP:aspect id = " logAspect " ref = " logAspectTarget " >
< AOP:pointcut id = " business service " expression = " execution(* hibernate sample . service .)*。*(..))"/>
< AOP:after pointcut-ref = " business service " method = " log method "/>

以上工作相当于Spring1的自动代理。x我们接下来需要定义的任何服务Bean都可以非常纯粹:

< bean id = " accountService " class = " hibernate sample . service . impl . accountserviceimpl " >
< property name = " account Dao " ref = " account Dao " >

与第一种相比,第二种实现AOP的方式只是在日志方面增加了注释,而省略了配置文件中与日志方面相关的配置。重写后的LogingAspect如下所示:

@Aspect

公共类loging aspect {
@ Pointcut(" execution(* hibernate sample . service .)*。*(..))"
public void business service(){ }
@ After(" business service()"
public void log method(join point jp){
system . err . println(jp . get target()。getClass());
system . err . println(jp . get signature()。getName());
}
}

简化的配置文件可以删除上述与logAspect相关的配置信息,如下所示:

< AOP:aspect id = " loga SPECT " ref = " loga SPECT target " >
< AOP:pointcut id = " business service " expression = " execution(* hibernate sample . service . *。* (..))"/>
< AOP:after pointcut-ref = " business service " method = " log method "/>

< bean id = " logAspectTarget " class = " hibernate sample . service . util . loging aspect " >

这还不是全部。为了让Spring应用LogingAspect的注释,需要在配置文件中添加。

< aop:aspectj-autoproxy/>

如果你觉得事务配置比使用注释更简洁(我不会这么认为,毕竟配置文件中声明的事务只是固定的段,除非作用于类的事务逻辑复杂),你也可以使用Spring提供的事务注释作用于类文件,这是一种更细粒度的事务声明。

坦白说,由于时间有限,这篇文章比较粗糙。对Spring AOP感兴趣和有疑问的可以参考Spring的文档,做的很好。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Spring2.X中AOP的使用浅析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情