2016-03-03 37 views
0

我試圖使用吉斯我的代碼注入的org.springframework.ui.velocity.VelocityEngineFactoryBean一個實例。但不知道如何指定此Bean的屬性velocityProperties注入性到像VelocityEngineFactoryBean類使用吉斯類似於春天

目前在春天,我可以使用它。

<bean id="velocityEngine" 
     class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> 
     <property name="velocityProperties"> 
      <props> 
       <prop key="resource.loader">class</prop> 
       <prop key="class.resource.loader.class"> 
        org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader 
       </prop> 
      </props> 
     </property> 
    </bean> 

VelocityEngineFactoryBean類沒有@Inject註釋的這個屬性。

public class VelocityEngineFactoryBean extends VelocityEngineFactory 
     implements FactoryBean<VelocityEngine>, InitializingBean, ResourceLoaderAware { 

    private VelocityEngine velocityEngine; 

它也沒有提供一個setter這個。

  1. 那麼如何在我的代碼中使用Guice注入像這樣的對象?
  2. 一般來說,如何創建此類型的對象並在代碼中使用它?
+0

你試過下面的Guice指南,它不適合你? – stjepano

+0

是的,我跟着它。但找不到任何可以執行此操作的內容。 有'bindProperties',但需要相應的類才能使用'@Inject'來綁定屬性。由於這是編譯爲jar我不能這樣做。 我正在做的工作是爲實際的VelocityEngine或使用**反射**和Guice寫一個**包裝**。但這兩種方法似乎都是做事的一種拙劣的方式。 –

回答

2

這是我實施它的方式。

  1. 在apache VelocityEngine上編寫一個自定義的包裝,而不是使用VelocityEngineFactoryBean。
  2. 使用提供者在Guice中注入它們。

這工作。

@Provides 
     VelocityEngine velocityEngine() throws Exception { 
      Properties props = new Properties(); 
      props.put("resource.loader", "class"); 
      props.put("class.resource.loader.class", ClasspathResourceLoader.class.getName()); 
      return new VelocityEngine(props); 
     } 

Guice會注入VelocityEngine。

有另一種方式來做到這一點,如果我想用VelocityEngineFactoryBean,使用reflection and Provides創建VelocityEngineFactoryBean的一個實例。 然而,這看起來更像是一個黑客,所以我想直接創建一個Apache引擎的實例,而不是使用Spring。