使用类似于Spring的Guice将属性注入VelocityEngineFactoryBean等类

时间:2016-03-03 08:04:06

标签: java spring dependency-injection guice velocity

我正在尝试使用 Guice 在我的代码中注入 org.springframework.ui.velocity.VelocityEngineFactoryBean 的实例。但不确定如何指定此Bean的Property velocityProperties

目前在春季,我可以使用。

<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>

Class VelocityEngineFactoryBean没有@Inject批注的此属性。

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

    private VelocityEngine velocityEngine;

它也没有为此提供制定者。

  1. 那么如何使用Guice在我的代码中注入这些对象呢?
  2. 一般情况下,如何创建此类型的对象并在代码中使用它?

1 个答案:

答案 0 :(得分:2)

这是我实施它的方式。

  1. 围绕apache VelocityEngine编写自定义包装器,而不是使用VelocityEngineFactoryBean。
  2. 使用提供程序将它们注入Guice。
  3. 这很有用。

     @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。