Play 2.6 模板中的依赖注入

模板中的依赖注入

通过使用构造器,模板可以被生成为一个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默认包含了这个配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值