网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 开源技术 > Spring > Spring Framework中的面向方面编程一  

Spring Framework中的面向方面编程一

2005-12-17  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  作为这个介绍Spring框架中的面向方面编程(Aspect-Oriented Programming,AOP)的系列的第一部分,本文介绍了使您可以使用Spring中的面向方面特性进行快速开发的基础知识。使用跟踪和记录方面(面向方面领域的HelloWorld)作为例子,本文展示了如何使用Spring框架所独有的特性来声明切入点和通知以便应用方面。本系列的第二部分将更深入地介绍如何运用Spring中的所有通知类型和切入点来实现更实用的方面和面向方面设计模式。对于AOP的更一般性的介绍,请查看ONJava站点上Graham O'Regan的文章,“Introduction to Aspect-Oriented Programming”。

中国网管论坛bbs.bitsCN.com

  本文的目的不是要介绍构成模块化J2EE系统——即Spring框架——的所有重要元素,我们将只把注意力放在Spring所提供的AOP功能上。由于Spring的模块化设计方法,我们可以只使用该框架的AOP元素,而无需对构成Spring框架的其他模块做太多考虑。

网管下载dl.bitscn.com

  在AOP方面,Spring提供了什么?

网管论坛bbs_bitsCN_com

  “它的目标不是提供最完善的AOP实现(虽然Spring AOP非常强大);而是要提供AOP实现与Spring IoC的紧密集成,以便帮助解决企业应用中的常见问题。”

网管bitscn_com

  Spring Framework参考文档 网管bitscn_com

  为了实现这个目标,Spring框架目前支持一组AOP概念,从切入点到通知。本文将展示如何使用Spring框架中所实现的如下AOP概念: 网管u家u.bitsCN.com

  通知(Advice):如何将before通知、afterReturning通知和afterThrowing通知声明为bean。

网管下载dl.bitscn.com

  切入点(Pointcut):如何声明静态切入点逻辑以将XML Spring Bean Configuration文件中的所有内容联系在一起。 网管bitscn_com

  Advisor:关联切入点定义与通知bean的方式。 网管u家u.bitscn@com

  设置场景:一个简单的例子应用程序

网管网www.bitscn.com

  “一般而言,Spring并不是预描述的。虽然使用好的实践非常容易,但是它避免强制推行一种特定的方法。” 网管联盟bitsCN@com

  Spring Framework参考文档 中国网管论坛bbs.bitsCN.com

  要试用Spring框架的AOP功能,首先我们要创建一个简单的Java应用程序。IbusinessLogic接口和BusinessLogic类为Spring框架中的bean提供了简易构件块。虽然该接口对于我们的简单应用程序逻辑来说不是必需的,但是它是Spring框架所推荐的良好实践。 网管联盟bitsCN@com

public interface IBusinessLogic
{
    public void foo();
}

网管网www.bitscn.com

public class BusinessLogic
    implements IBusinessLogic
{
    public void foo()
    {
        System.out.println(
        "Inside BusinessLogic.foo()");
    }
}
  可以编写MainApplication类,借此练习BusinessLogic bean的公有方法。

网管网www.bitscn.com

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; 中国网管论坛bbs.bitsCN.com

public class MainApplication
{
    public static void main(String [] args)
    {
        // Read the configuration file
        ApplicationContext ctx =
          new FileSystemXmlApplicationContext(
            "springconfig.xml"); 网管网www.bitscn.com

        //Instantiate an object
        IBusinessLogic testObject =
          (IBusinessLogic) ctx.getBean("businesslogicbean");

网管联盟bitsCN_com

        // Execute the public
        // method of the bean
        testObject.foo();
    }
}

网管bitscn_com

  在BusinessLogic类及其关联接口中没有什么需要注意的。但是,MainApplication类初始化BusinessLogic对象的方式很有意思。通过使用ctx.getBean("businesslogicbean")调用,MainApplication将加载和管理BusinessLogic类的bean实例的任务转交给了Spring框架。 网管联盟bitsCN_com

  允许Spring控制BusinessLogic bean的初始化,这使得Spring运行时有机会在bean被返回给应用程序之前执行J2EE系统所需的所有与bean相关的管理任务。然后Spring运行时配置可以决定对bean应用哪些任务和模块。该配置信息由一个XML文件提供,类似于下面所示的:

网管下载dl.bitscn.com


    "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">



  
      class="org.springframework.aop.framework.ProxyFactoryBean">
     
         IBusinessLogic
      网管下载dl.bitscn.com

     
        
     

网管论坛bbs_bitsCN_com


  
  
      class="BusinessLogic"/>

网管u家u.bitscn@com

中国网管论坛bbs.bitsCN.com

  该配置文件,即springconfig.xml,指定要加载一个接口与IbusinessLogic相匹配的bean。该bean随后被关联到BusinessLogic实现类。看起来好像是费了很大力气只为了加载一个简单的bean并调用一个方法,但是您要知道,这个配置文件只是使Spring框架可以透明地对应用程序应用其组件的众多特性的一个体现。 网管bitscn_com

  图1显示了基本的顺序图:MainApplication原样执行,没有应用方面。
网管u家u.bitsCN.com

Figure 1 网管联盟bitsCN_com


图1.没有对BusinessLogic bean应用方面时的顺序图 网管联盟bitsCN@com

  应用方法跟踪(Method Tracing)方面 中国网管论坛bbs.bitsCN.com

  可能最基本的方面就是方法跟踪方面了。这可能是您找得到的最简单的方面了,因此它是研究新的AOP实现的一个很好的起点。 网管u家u.bitsCN.com

  方法跟踪方面在一个目标应用程序内捕获对所跟踪的方法的调用以及方法的返回值,并以某种方式显示这种信息。在AOP中,通知的before和after类型用于捕获这些类型的联结点,因为这两种通知可以在方法调用联结点之前或之后触发。使用Spring框架,方法跟踪方面的before通知是在TracingBeforeAdvice类中声明的。 网管联盟bitsCN_com

import java.lang.reflect.Method;
import org.springframework.aop. MethodBeforeAdvice; 网管联盟bitsCN@com

public class TracingBeforeAdvice
   implements MethodBeforeAdvice
{
    public void before(Method m,
                     Object[] args,
                     Object target)
                     throws Throwable
    {
        System.out.println(
          "Hello world! (by " +
          this.getClass().getName() +
          ")");
    }
}

网管联盟bitsCN_com

  类似地,after通知可以在TracingAfterAdvice类中声明。 网管网www_bitscn_com

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice; 网管网www.bitscn.com

public class TracingAfterAdvice
   implements AfterReturningAdvice
{
    public void afterReturning(Object object,
                             Method m,
                             Object[] args,
                             Object target)
                             throws Throwable
    {
        System.out.println(
          "Hello world! (by " +

网管u家u.bitsCN.com

          this.getClass().getName() +
          ")");
    }
} 中国网管论坛bbs.bitsCN.com

  这两个类都通过实现Spring框架的适当通知接口而表示了特定的通知。每种类型的通知都指定实现before(..)或afterReturning(..)方法,以便使Spring运行时可以告诉通知适当的联结点会在何时出现。值得注意的是,TracingAfterAdvice实际上是从AfterReturningAdvice扩展而来的,表示只有在联结点在无异常的情况下获得返回值时才运行通知。 网管联盟bitsCN_com

  为了将通知与应用程序中的适当联结点关联起来,必须对springconfig.xml进行一些修改。 网管网www_bitscn_com

网管网www.bitscn.com


    "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">



  
      class="org.springframework.aop.framework.ProxyFactoryBean">
     
         IBusinessLogic
      网管联盟bitsCN@com

     
        
      网管联盟bitsCN_com

     
        
            theTracingBeforeAdvisor
            theTracingAfterAdvisor
        

        

网管联盟bitsCN@com

  

  
      class="BusinessLogic"/>

  
         class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
     
        
      网管u家u.bitsCN.com

     
         .*
     

网管网www_bitscn_com


  


  
         class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
     
        
      中国网管论坛bbs.bitsCN.com

     
         .*
      网管u家u.bitsCN.com

  
  
         class="TracingBeforeAdvice"/>
         class="TracingAfterAdvice"/>



  theTracingBeforeAdvisor和theTracingAfterAdvisor advisor被添加到前面所声明的businesslogicbean。每个advisor都可能截获所有bean所关联到的联结点。Advisor本身就是bean,而它唯一的作用就是将切入点定义与通知bean关联起来。本例中的切入点定义是在静态对象层次结构中指定相关联结点的正则表达式。

网管联盟bitsCN_com

  因为本例中使用了org.springframework.aop.support.RegexpMethodPointcutAdvisor切入点advisor,切入点逻辑是使用正则表达式指定的。正则表达式用于识别公有接口对IbusinessLogici接口的联结点。下面是一些可以用来指定IBusinessLogic接口上的不同联结点集合的正则表达式例子:

网管联盟bitsCN@com

  .*:该表达式选择advisor所关联到的一个或多个bean上的所有联结点。 网管下载dl.bitscn.com

  ./IBusinessLogic/.foo:该表达式只选择IbusinessLogic接口上的foo()方法的联结点。如果是advisor所关联到的bean,则该表达式只选择IBusinessLogic接口上的联结点。 网管bitscn_com

  springconfig.xml文件中最后的bean声明指定实现通知bean的类。 网管bitscn_com

  既然已经指定了跟踪方面的正确配置,那么下一次执行MainApplication时,这些方面就会在初始化过程中被编织进去,而BusinessLogic bean中的所有方法都将被跟踪,如图2所示。

网管下载dl.bitscn.com

网管网www.bitscn.com

  图2. 方法跟踪方面应用到BusinessLogic bean之后的顺序图(单击图像查看大图) 网管u家u.bitsCN.com

  方面的重用

网管联盟bitsCN@com

  可以对方法跟踪方面进行扩展,提供一个稍微复杂的记录(Logging)方面。记录方面提供了一个很不错的重用例子,因为记录方面所需的许多特性都已经包含在方法跟踪方面中了。

网管网www_bitscn_com

  在本例中,记录方面扩展了方法跟踪方面,以便显示附加的与(在应用程序的执行过程中)所引发的异常有关的信息。

中国网管联盟bitsCN.com

  要完全使用记录方面,需要对应用程序做一些更改。BusinessLogicException异常类提供了一个可以由IBusinessLogicInterface接口和BusinessLogic实现类新增的void bar()方法引发的异常。 网管bitscn_com

public class BusinessLogicException
   extends Exception
{ 网管u家u.bitscn@com

}

网管bitscn_com

public interface IBusinessLogic
{
    public void foo(); 网管下载dl.bitscn.com

    public void bar()
      throws BusinessLogicException;
}

网管网www.bitscn.com

public class BusinessLogic
   implements IBusinessLogic
{
    public void foo()
    {
        System.out.println(
          "Inside BusinessLogic.foo()");
    }

网管u家u.bitsCN.com

    public void bar()
       throws BusinessLogicException
    {
        System.out.println(
        "Inside BusinessLogic.bar()");
          throw new BusinessLogicException();
    }
} 网管下载dl.bitscn.com

  MainApplication类现在将对void bar()方法进行一次额外的调用,并处理选中的、可能由该方法引发的异常。

网管网www.bitscn.com

import org.springframeworkcontext.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

网管bitscn_com

public class MainApplication
{
    public static void main(String [] args)
    {
        // Read the configuration file
        ApplicationContext ctx =
          new FileSystemXmlApplicationContext(
            "springconfig.xml"); 网管u家u.bitsCN.com

       //Instantiate an object
       IBusinessLogic testObject =
          (IBusinessLogic) ctx.getBean(
            "businesslogicbean");

网管论坛bbs_bitsCN_com

       //Execute the public methods of the bean
       testObject.foo();

网管网www_bitscn_com

       try
       {
           testObject.bar();
       }
       catch(BusinessLogicException ble)
       {
           System.out.println(
             "Caught BusinessLogicException");
       }
    }
}

中国网管论坛bbs.bitsCN.com

  来自方法跟踪方面的TracingBeforeAdvice和TracingAfterAdvice通知可以整体重用。LoggingThrowsAdvice类为新的异常记录提供了通知。 网管论坛bbs_bitsCN_com

import org.springframework.aop.ThrowsAdvice;
import java.lang.reflect.Method;

网管u家u.bitsCN.com

public class LoggingThrowsAdvice
   implements ThrowsAdvice
{
    public void afterThrowing(Method method,
                            Object[] args,
                            Object target,
                            Throwable subclass)
    {
       System.out.println(
         "Logging that a " +
         subclass +
         "Exception was thrown.");
    }
}
  应用记录方面的最后一步是修改springconfig.xml配置文件,使其包含新添加的LoggingThrowsAdvice通知。

中国网管论坛bbs.bitsCN.com

  图3显示了运行MainApplication并使用Spring框架应用了记录方面的UML顺序图。


  图3. 记录方面应用到BusinessLogic bean之后的顺序图(单击图像查看大图)

中国网管联盟bitsCN.com

  此处的记录方面清楚地说明了如何重用现有方面以及如何在Spring框架中使用通知的throws形式。通过为before和after通知声明新的通知来重写现有的方法跟踪方面实现,可以实现更复杂的记录方面,记录到更复杂的记录框架,比如LOG4J。

中国网管联盟bitsCN.com

  结束语

网管bitscn_com

  本文展示了使用Spring框架中的基本AOP结构所应用的一些简单方面。在本系列的下一篇文章中,我们将介绍一些更实用的方面,探讨方面的生命周期,使用Spring框架的around通知,并使用Spring来应用AOP模式。

中国网管联盟bitsCN.com


TAGs编程   方面   面向   Spring   通知   方法   框架   bean   记录    
 上一篇:Struts+Spring+Hibernate实现上传下载   下一篇:Spring MVC framework深入总体分析
相关文章列表
Spring Framework中的面向方面编程一 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.详细的 spring 入门实例讲解运用
2.spring+hibernate+jbpm整合成功
3.Struts+Spring+Hibernate实现上传下载
4.整合 JSF+Spring+Hibernate的小例子
5.用Spring更好地处理Struts动作三种整合
6.Spring与iBATIS的集成
7.Spring AOP之Hello World
8.Spring MVC验证的配置步骤
9.基于Spring例子的JPetStore分析
10.WEB开发中Spring AOP实际应用一例
最新推荐文章:
1.应用spring示例开发网站构思
2.Spring 数据源配置与应用
3.Spring中的四种声明式事务的配置
4.spring.net 学习笔记之AOP
5.Spring DAO之JDBC
6.Struts 2, spring 2, hibernate 的整合
7.spring 编程入门十大问题解答
8.Spring与struts整合开发实例(一)
9.spring入门几个问题及解决
10.Spring框架概述
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的