在非弹簧环境中注入一个方面的组件

时间:2014-05-07 07:21:14

标签: spring dependency-injection aspectj

我们在代码库中有一个名为BusinessRuleAspect的方面,用于客户端和项目的服务器端。在服务器端,我们有spring,组件从应用程序上下文中注入:

    <bean id="businessRuleAspect" class="com.fugro.gwf.domain.rules.aspects.BusinessRuleAspect" 
            factory-method="aspectOf">
            <property name="businessRuleManager" ref="businessRuleManager" />
    </bean>

问题:在客户端我们没有spring,在这种情况下注入businessRuleManager组件的最佳方法是什么?

2 个答案:

答案 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”)是非常困难的(甚至可能是不可取的)。