Spring依赖注入或方面编程

时间:2009-01-12 23:03:21

标签: spring aop

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

public void method(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框架来完成此方法中重复部分的逻辑,而无需在我的各个类中反复编写这些行?如果是这样的话?

3 个答案:

答案 0 :(得分:2)

绝对可以通过Spring的AOP支持来完成。您可以将第一部分应用为“之前”建议,将第二部分应用为“最终之后”建议,或者您可以将两者都应用为“around”建议,并以编程方式调用目标方法,如下所示:

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中应用该行为时,建议更可重用。

答案 1 :(得分:1)

作为完整IoC容器的替代方案,您可以使用委托实现相同的功能。设计具有前后功能的基类和委托,以注入不同的业务逻辑功能。 “RunProcess”基类函数将调用预操作,委托,然后调用操作。

答案 2 :(得分: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的密码,因为在创建代理之前提供了属性值。当然,您无法将password属性应用于ProxyBeanFactory类。你真正想做的是使用“lkaj ...”参数调用从ProxyBeanFactory返回的对象调用setPassword(),但这似乎是不可能的。