<%@ page contentType="text/html; charset=gb2312"%> Spring 2.X 中AOP的使用浅析
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
Spring 2.X 中AOP的使用浅析
     发布者: 发布时间:2007-09-06
  本文转自javablog,文中内容不代表本站观点,仅提供参考。

  和Spring1.X相比,Spring2.X使用AspectJ的语法来声明AOP,这使得它更“标准”,更灵活了。还是那句话,如果你不了解AspectJ并且打算使用Spring2.X的AspectJ式AOP,那就学学AspectJ吧,这方面的书还是很多了。

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

  先介绍第一种配置方式。需要指出的是,Spring2.X的beans名称空间和Spring1.X有所不同,它采用了Schema而不是DTD(也可采用DTD方式,具体的请参考文档)。还是引入毫无意义的日志切面,定义的切面类LogingAspect 如下:

public class LogingAspect {
 public void logMethod(JoinPoint jp){
  System.err.println(jp.getTarget().getClass());
  System.err.println(jp.getSignature().getName());
 }
}

  同时在配置文件中如下配置:

< bean id = " logAspectTarget " class = " hibernatesample.service.util.LogingAspect " >
</ bean >
< aop:config >
< aop:aspect id = " logAspect " ref = " logAspectTarget " >
< aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect >
</ aop:config >

  对于上面的切面,切入点businessService是在配置文件中声明的,其表达式采用了 AspectJ的语法,LogingAspect 类中logMethod(JoinPoint jp)方法根据配置文件信息可知其是after通知,方法的JoinPoint参数不是必须的,它是来自于AspectJ的实用类,这里用它不过输出一些和连接点有关的信息。当然,在Spring2.X中,切入点和通知能更灵活的使用,我们可以如AspectJ一样传递参数给通知。如果需要在Service中引入事务功能,需要如下配置事务通知:

< tx:advice id = " txAdvice " transaction - manager = " transactionManager " >
< tx:attributes >
< tx:method name = " get* " read - only = " true " />
< tx:method name = " find* " read - only = " true " />
< tx:method name = " * " />
</ tx:attributes >
</ tx:advice >
< aop:config >
< aop:pointcut id = " demoServiceMethods " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:advisor advice - ref = " txAdvice " pointcut - ref = " demoServiceMethods " />
< aop:aspect id = " logAspect " ref = " logAspectTarget " >
< aop:pointcut id = " businessService " expression = " execution(* hibernatesample.service.*.*(..)) " />
< aop:after pointcut - ref = " businessService " method = " logMethod " />
</ aop:aspect >
</ aop:config >

  完成上面的工作相当于完成了 Spring1.X 的 自动代理。 我们接下来需要定义的任何 Service Bean 都可以很纯粹很纯粹了:

< bean id ="accountService" class ="hibernatesample.service.impl.AccountServiceImpl" >
< property name ="accountDAO" ref ="accountDAO" ></ property >
</ bean >

  第二种实现 AOP 的方式和第一种相比,只是在 LogingAspect 中加入了注释,而省去了配置文件中和 LogingAspect 相关的配置。重新编写的 LogingAspect 如下:

@Aspect

public class LogingAspect {
@Pointcut( " execution(* hibernatesample.service.*.*(..)) " )
public void businessService(){}
@After( " businessService() " )
public void logMethod(JoinPoint jp){
 System.err.println(jp.getTarget().getClass());
 System.err.println(jp.getSignature().getName());
}
}

  而简化后的配置文件可以去除上面的如下和 logAspect 相关的配置信息:

< aop:aspect id ="logAspect" ref ="logAspectTarget" >
< aop:pointcut id ="businessService" expression ="execution(* hibernatesample.service.*.*(..))" />
< aop:after pointcut-ref ="businessService" method ="logMethod" />
</ aop:aspect >
< bean id ="logAspectTarget" class ="hibernatesample.service.util.LogingAspect" ></ bean >

  还没有完,为了使 Spring 应用 LogingAspect 的注释,需要在配置文件中添上

<aop:aspectj-autoproxy/>

  如果觉得事务的配置没有使用注释更简洁(我倒不会有这样的想法,毕竟在配置文件中声明的事务只是那么固定的几段,除非作用于类上的事务逻辑上很复杂),也可以使用Spring提供的事务注释作用于类文件上,这可是更细粒度的事务声明了。

  坦率的说,由于时间有限,该文写的比较粗糙。对于Spring AOP有兴趣并有疑问的朋友,可以参考Spring的文档,它的文档做的还是不错的。

 

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Java实战篇:设计自己的Annotation
Java中调用SQL Server存储过程示例
Java中消除实现继承和面向接口编程
对Java程序多态性支持的改进
应用实例 JSP+JavaScript打造级连菜单
教你如何成为一名合格的Java初级程序员
 
最近评论:
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(7181)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(1191)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号