2

我需要几个类中的方法,这些方法必须始终遵循特定的前后模式。

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

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

AFrameworkClass aFrameworkClass = new 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(); 

} 最后 { aFrameworkClass.doCleanup();

}

// ************重复部分结束 ******************/

}

是否可以使用 Spring 框架来完成此方法中重复部分的逻辑,而不必在我的各种类中一遍又一遍地编写这些代码?如果有怎么办?

4

3 回答 3

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 包含可重用的建议,并且正在使用注释来处理订单、切入点等。如果您需要更改该行为,则必须重新构建 A。如果您在项目 B 中使用 XML要从项目 A 配置方面,不需要重建 A。

我的感觉是,当您在类中定义行为以及如何在 XML 中应用该行为时,建议更可重用。

于 2009-01-12T23:13:41.177 回答
1

作为成熟 IoC 容器的替代方案,您可以使用委托来实现相同的目的。设计一个具有前置和后置功能的基类以及一个委托来注入您不同的业务逻辑功能。“RunProcess”基类函数将调用前操作、委托,然后是后操作。

于 2009-01-12T23:25:20.513 回答
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 类。您真正想要做的是使用“lkaj ...”参数对从 ProxyBeanFactory 返回的对象调用 setPassword(),但这似乎是不可能的。

于 2009-01-12T23:24:12.060 回答