我们在代码库中有一个名为BusinessRuleAspect的方面,用于客户端和项目的服务器端。在服务器端,我们有spring,组件从应用程序上下文中注入:
<bean id="businessRuleAspect" class="com.fugro.gwf.domain.rules.aspects.BusinessRuleAspect"
factory-method="aspectOf">
<property name="businessRuleManager" ref="businessRuleManager" />
</bean>
问题:在客户端我们没有spring,在这种情况下注入businessRuleManager组件的最佳方法是什么?
答案 0 :(得分:0)
如果不了解您正在做的事情的确切内部(或者可能更确切地说是为什么),您可以做的就像您的方面中的以下内容。 (不是最干净的选择,但至少是一个起点)
如果BusinessRuleManager是一个单例,你如何实例化/从非Spring应用程序的其他地方检索它?或者仅在方面内使用?
after(PersistentObject persistentObject) :
persistentObjectPropertySetter(persistentObject)
{
if(businessRuleManager!=null)
businessRuleManager = BusinessRuleManager.getInstance();
if(businessRuleManager!=null)
{
businessRuleManager.execute(persistentObject,
thisJoinPoint.getSignature().getName());
}
}
在您的BusinessRuleManager中:
class BusinessRuleManager{
.......
static private BusinessRuleManager instance;
static public BusinessRuleManager getInstance(){
if( instance == null )
instance = new BusinessRuleManager();
return instance;
}
.......
}
这应该允许你使用弹簧注射混合物和非弹簧容器。
答案 1 :(得分:0)
回答你的问题:“如果BusinessRuleManager是一个单例,你如何实例化它/从非Spring应用程序的其他地方检索它?”。 以下是执行此操作的具体代码:
BusinessRuleManager businessRuleManager = ContextInjectionFactory.make(BusinessRuleManagerImpl.class, context);
context.set(BusinessRuleManager.class, businessRuleManager);
这个构造将我们的管理器实例放在eclipse RCP上下文中,准备注入各种其他eclipse RCP组件。这意味着,借用你的代码,我们会得到类似的东西:
after(PersistentObject persistentObject) : persistentObjectPropertySetter(persistentObject) {
if(businessRuleManager==null) {
Bundle bundle = FrameworkUtil.getBundle(BusinessRuleManager.class);
BundleContext bundleContext = bundle.getBundleContext();
IEclipseContext eclipseCtx = EclipseContextFactory.getServiceContext(bundleContext);
businessRuleManager = eclipseCtx.get(BusinessRuleManager.class);
}
if(businessRuleManager!=null) {
businessRuleManager.execute(persistentObject, thisJoinPoint.getSignature().getName());
}
}
我试图让它工作,但失败了。主要问题是该方面存在于域模块中,该模块在服务器和客户端之间共享。在域的共享代码库中使用客户端依赖注入框架(“RCP E4”)是非常困难的(甚至可能是不可取的)。