Есть более простой способ сделать это. Если вы уже используете Spring FreeMarkerConfigurer, вы можете передать ему карту переменных:
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
p:templateLoaderPath="/some_path_here">
<property name="freemarkerVariables">
<map>
<entry key='macroName' value-ref="templateModelRef" />
</map>
</property>
</bean>
<bean id="templateModelRef" class="...class..extends TemplateModel">
<property name="someResource" value-ref="resourceRef"/>
</bean>
Теперь по крайней мере в классе, который расширяет метод execute TemplateDirectiveModel, у вас есть доступ к этому внедренному свойству.
public class MyDirective extends TemplateDirectiveModel {
private MyResource someResource;
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars,TemplateDirectiveBody body) throws TemplateException, IOException {
StringModel sharedVariable = (StringModel)env.getConfiguration().getSharedVariable("beanName");
MyClass sweetness = (MyClass)sharedVariable.getWrappedObject();
}
}
Теперь в вашем .ftl вы можете использовать:
<@ macroName />
и в него будут автоматически вставлены зависимости пружины.