2009-01-12 70 views
1

我需要在几个类中必须始终遵循特定的前和后模式的方法。春天依赖注入或方面编程

公共无效方法(X X,Y y)的{

// ************重复部分开始************** ****/

aFrameworkClass aFrameworkClass =新aFrameworkClass(this.memberVariable “SomeString”);

尝试{

aFrameworkClass.aFrameworkMethod(x,y); 
    aFrameworkClass.anotherFrameworkMethod(x,y); 
    aFrameworkClass.yetAnotherFrameworkMethod(x); 
    aFrameworkClass.doPreProcessing(); 

    Throwable t = null ; 

// ************重复部分末端******************/

try { 
    // code will vary according to the business logic 
    } 
    catch (Throwable t) { 
    // code will vary according to the business logic 
    } 

// ************重复部分开始******************/

aFrameworkClass.doPostProcessing(); 

} finally { aFrameworkClass.doCleanup();

}

// ************重复部分末端******************/

}

是否可以使用Spring框架来实现,在这种方法的重复部分的逻辑,而不必对这些线在我的各类一遍又一遍的代码?如果是这样如何?

回答

2

绝对可以用Spring的AOP支持完成。您可以将第一部分为“前”的建议和第二为“后终于”的建议,也可以为“绕”的建议同时应用和编程调用目标方法,像这样:

methodInvocation.invoke(); // returns Object 

如果你想声明XML格式的方面,你可以了解如何在这里做到这一点:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-before http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-schema-advice-after-finally http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj-around-advice

或者,如果你想与注解做到这一点有信息在这里:

http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj

我个人更喜欢用XML做它,因为各方面的行为,不需要重新编译应用而改变。假设您有一个多模块项目,其中B依赖于A.一个包含可重用的建议并正在使用批注,命令,切入点等。如果需要更改该行为,则必须重建A.如果在项目B中使用XML要从项目A配置方面,不需要重建A.

我的感觉是,建议被更可重复使用的,当你定义一个类,以及如何行为在XML应用的行为。

+0

您指的是'我个人更喜欢用XML来做它,因为可以在不重新编译应用程序的情况下更改方面的行为',您究竟在说什么? – krosenvold 2009-01-13 06:44:20

+0

AspectJ API中有注释允许您在Java代码中定义AOP行为: http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-ataspectj 例如,您可以使用@Order指定建议订单。我宁愿使用XML来代替;易于更改,无需编译 – 2009-01-15 21:13:51

+0

XMl配置文件通常打包在EAR或WAR中。您将不得不重建项目进行重新打包,这反过来又引入了需求回归测试 – zkarthik 2009-01-16 02:34:20

0

brd6644是正确的,但有一件事我发现是一个问题,Spring AOP是有关的意见/顾问不能为正在创建的对象应用于属性。

也就是说,假设你有类似

<bean class="...ProxyBeanFactory"> 
    <property name="target"> 
     <bean class="myBean"> 
      <property name="username" value="helloKitty"/> 
      <property name="password" value="lkajdahdkahjdkhja"/> 
     </bean> 
    </property> 
</bean> 

这是不可能写一个顾问解密的为myBean的密码,因为在创建代理之前被提供的属性值。当然,您无法将密码属性应用于ProxyBeanFactory类。你真正想要做的就是从ProxyBeanFactory返回的具有“lkaj ...”参数的对象上调用setPassword(),但这似乎是不可能的。

1

作为一个完整的IoC容器的替代方案,您可以使用委托来实现同样的功能。使用前后函数和委托来设计一个基类,以注入不断变化的业务逻辑函数。一个“RunProcess”基类函数会调用预操作,委托,然后是后操作。