我需要几个类中必须始终遵循特定前后模式的方法。
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框架来完成此方法中重复部分的逻辑,而无需在我的各个类中反复编写这些行?如果是这样的话?
答案 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(),但这似乎是不可能的。