如何在Spring中为bean定义获取Restlet'Context'?

时间:2012-03-31 23:52:24

标签: spring freemarker instantiation autowired restlet-2.0

我正在尝试将Freemarker的配置实例初始化并由Spring缓存,以便在我的Restlet应用程序中使用。问题是ContextTemplateLoader采用类型org.restlet.Context的参数,可以通过应用程序中的getContext()方法调用访问。如何在Spring容器中访问这个上下文,其中Restlet是'主容器'(即这是一个使用spring而不是反之亦然的restlet应用程序)?

目前我正在缓存freemarker配置:


public class HelloWorldComponent extends Component {
    //Cache freemarkerConfiguration
    private static Configuration freemarkerConfiguration;

    public HelloWorldComponent()
    {
        freemarkerConfiguration = new Configuration();
        // Must pass getContext() as argument - prevents 'springification?'
        ContextTemplateLoader loader = new ContextTemplateLoader(getContext(), "war:///WEB-INF");
        freemarkerConfiguration.setTemplateLoader(loader);

        /* All other beans created and cached by loading the SpringContext */

        SpringContext springContext = new SpringContext(getContext());
        springContext.getXmlConfigRefs().add("war:///WEB-INF/applicationContext.xml");      

        getServers().add(Protocol.HTTP);
        this.getDefaultHost().attach(new HelloWorldApplication());

    }

    public static Configuration getFreemarkerConfiguration()
    {
        return freemarkerConfiguration;
    }

我个人更喜欢让Spring本身可以缓存freemarker配置,但是ContextTemplateLoader需要Context,这在应用程序之外是不可访问的。使用静态方法似乎是一种黑客攻击。

让spring实例化freemarker配置的最简单/最简单/最简洁的方法是什么?

原因:在每次访问模板之前加载配置是没有意义的,最好对其进行缓存。如果可以在Spring本身定义并且IoC刚刚在org.restlet.Component

中实例化,那真的很整洁

似乎有一个静态方法Context.getCurrent()可用于获取当前上下文,但我不知道如何通过spring调用它(如果有的话)。我不想让Spring MVC libs等创建一个freemarker配置实例(有ways to do that但我不想要Spring相关的servlet等。)

1 个答案:

答案 0 :(得分:0)

如何使用Spring的表达式语言并假设你有一个名为“application”的org.restlet.Application bean:

<bean id="freemarkerConfig" class="freemarker.template.Configuration">
    <property name="templateLoader">
      <bean class="org.restlet.ext.freemarker.ContextTemplateLoader">
        <constructor-arg value="@application.context"/>
        <constructor-arg value="war:///WEB-INF/templates/" />
      </bean>
    </property>
    <property name="localizedLookup" value="false" />
  </bean>