模板中的依赖注入
通过使用构造器,模板可以被生成为一个class而不是一个静态对象。这就意味着模板可以被直接注入到Controller中,并且可以自己管理依赖。
假设我们有一个组件Summarizer
,这个组件不会被Controller使用
package services;
public interface Summarizer {
/** Provide short form of string if over a certain length */
String summarize(String item);
}
实现类
package services.impl;
import services.Summarizer;
public class SummarizerImpl implements Summarizer{
@Override
public String summarize(String item) {
return item;
}
}
接下来创建一个模版文件app/views/IndexTemplate.scala.html
@import services.Summarizer
@this(summarizer: Summarizer)
@(item: String)
@{summarizer.summarize(item)}
在Module中配置注入
import com.google.inject.AbstractModule;
import services.Summarizer;
import services.impl.SummarizerImpl;
public class Module extends AbstractModule {
@Override
public void configure() {
bind(Summarizer.class).to(SummarizerImpl.class);
}
}
然后将模版注入到Controller中
public class MyController extends Controller {
private final views.html.IndexTemplate template;
@Inject
public MyController(views.html.IndexTemplate template) {
this.template = template;
}
public Result index() {
String item = "some extremely long text";
return ok(template.render(item));
}
}
通过这种方式,Controller不用得知Summarizer
的存在,模版可以自己管理依赖信息。
如果在Play以外的框架中使用Twirl,需要用以下方式添加注解
TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"
Play默认包含了这个配置。