新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> Aspect-Oriented Analysis, Aspect-Oriented Design, Aspect-Oriented Programming,
    [返回] 计算机科学论坛计算机技术与应用『 面向方面的程序设计(AOP) 』 → [转帖]AOP在Spring中的实例 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 26875 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [转帖]AOP在Spring中的实例 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     wcdxyl 帅哥哟,离线,有人找我吗?天秤座1980-10-9
      
      
      威望:4
      等级:大四(每天看1小时莱昂氏)(版主)
      文章:158
      积分:1145
      门派:IEEE.ORG.CN
      注册:2006/3/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wcdxyl发送一个短消息 把wcdxyl加入好友 查看wcdxyl的个人资料 搜索wcdxyl在『 面向方面的程序设计(AOP) 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看wcdxyl的博客楼主
    发贴心情 [转帖]AOP在Spring中的实例

    Spring中AOP的实现就是通过动态代理来实现的。动态代理的实现在上篇blog中已经涉及。Spring中目前最为实用的AOP应用,非用其实现的事务管理机制莫属。也正是这一点,使得Spring AOP大方异彩。
    那么我们继续围绕上节的例子来探讨一下Spring中AOP机制的应用与开发。

      首先,看看AOP中几个基本的概念对应在AOP中的实现:
    ? 切点(PointCut)
      一系列连接点的集合,它指明处理方式(Advice)将在何时被触发。
      对于我们开发而言,“何时触发”的条件大多是面向Bean的方法进行制定。像Spring的配置化事务管理时针对方法名称可进行PointCut设置,从而指定对所有以声明字符开头的方法进行基于AOP的事务管理。那么同样,对于我们自己实现的AOP组件而言,我们也可以以方法名作为触发判定条件。
    我们可以通过在XML配置文件中配置以下节点,为我们的组件设定触发条件。
    <bean id="myPointcutAdvisor"
    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
    <ref local="MyInterceptor" />
    </property>
    <property name="patterns">
    <list>
    <value>.*save.*</value>
    <value>.*do.*</value>
    </list>
    </property>
    </bean>

      上面我们针对MyInterceptor设定了一个基于方法名的触发条件,也就是说,当目标类的指定方法运行时,MyInterceptor即被触发。
      ? 处理方式(Advice)
      也就是说要实现一个Interceptor,以供在连接点时触发。Spring中采用了AOP联盟(AOP Alliance)的通用AOP接口(接口定义位aopalliance.jar)。这里我们采用aopalliance.jar中定义的MethodInterceptor作为我们的Advice实现接口。那么我们上节例子中的处理方式应实现为如下Interceptor:
    package test.aop.spring;
    import java.util.logging.Logger;
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;

    /**
    * @author xkf
    **/
    public class LockInterceptor implements MethodInterceptor {
    private Logger logger = Logger.getLogger(this.getClass().getName());
    public Object invoke(MethodInvocation invocation) throws Throwable {
    // TODO Auto-generated method stub
    lock();
    Object ret= invocation.proceed();
    unlock();
    return ret;
    }
    private void lock(){
    logger.info("lock domain object...");
    }
    private void unlock(){
    logger.info("unlock domain object...");
    }
    }
      实现后,对应的Interceptor实现类在配置文件中的体现如下:
      <bean id="MyInterceptor" class="test.aop.spring.LockInterceptor"/>
      最后,我们还需要定义一个Spring AOP ProxyFactory用于加载执行AOP组件,并且需要将Advice通过IOC的方式注入到接口以及实现类。
      对应的配置文件应如下配置从而实现这些内容:
    <bean id="myAOPProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
    <value>test.aop.spring.DomainObjDAO</value>
    </property>
    <property name="target">
    <ref local="impl" />
    </property>
    <property name="interceptorNames">
    <value>myPointcutAdvisor</value>
    </property>
    </bean>
    <bean id="impl" class="test.aop.spring.DomainObjDAOImpl"/>
    万事大吉!写一个TestCase来看一下运行结果:
    package test.aop.spring;

    import junit.framework.TestCase;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;

    /**
    * @author xkf
    */
    public class SpringTestCase extends TestCase {
    DomainObjDAO test=null;

    protected void setUp() throws Exception {
    super.setUp();
    ApplicationContext ctx=new FileSystemXmlApplicationContext("test/Bean.xml");
    test = (DomainObjDAO) ctx.getBean("myAOPProxy");
    }

    protected void tearDown() throws Exception {
    super.tearDown();
    }
    public void testSave(){
    test.save();
    }
    }
    运行结果如下:
    信息: Creating shared instance of singleton bean 'MyInterceptor'
    2004-12-7 23:50:11 test.aop.spring.LockInterceptor lock
    信息: lock domain object...
    saving domain object......
    2004-12-7 23:50:11 test.aop.spring.LockInterceptor unlock
    信息: unlock domain object...

      OK!至此,我们已经探讨了AOP动态代理的实现以及其在Spring中的应用,接下来的Blog中我将会关注Spring中事务以及持久化的实现。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    主页:http://wcdxyl.blogchina.com
    MSN:wcdxyl@163.com

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/20 14:18:00
     
     GoogleAdSense天秤座1980-10-9
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 面向方面的程序设计(AOP) 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/20 11:38:41

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    4,945.313ms