跳到主要内容

绑定转换

在本教程中,我们将转换在一个单独的独立模块中声明的捆绑物。 我们将拦截一个在另一个模块中导出的依赖关系,并对其进行 ,以便在执行方法之前和方法完成之后增加一些基本的日志记录。

示例启动器#

首先,我们将创建一个新的启动器,通过扩展一个 启动器"。 类。

public class BindingTransformationExample extends Launcher {    ...}

然后让我们定义一个 Person 接口,有一个方法 void greet()

public interface Person {  void greet();}

并通过添加一个 person 字段,用 @Inject 注解注入一个 Person 类的实例到应用程序启动器。

@InjectPerson person;

我们的应用程序启动器重写了 Launcher#run 方法,只是为了调用 person.greet() 方法。

@Overrideprotected void run() {  person.greet();}

人员模块#

一个应用程序启动器将使用2个模块来注入一个 Person人 的依赖关系。

@Overrideprotected Module getModule() {  return Modules.combine(      new PersonModule(),      new PersonTransformModule()  );}

第一个(PersonModule)是一个简单的 AbstractModule ,为一个 Person 类提供一个依赖关系。

public static class PersonModule extends AbstractModule {  @Provides  Person greeter() {    return () -> System.out.println("Hello!");  }}

一个提供的 Person ,当 greet() 方法被调用时,简单地打印出 "Hello!"

人员转换模块#

一个 PersonTransformModule 是一个模块,它将拦截一个提供的 Person 类,并在 greet() 方法调用中添加日志。

public static class PersonTransformModule extends AbstractModule {  @Override  protected void configure() {    transform(Person.class, (bindings, scope, key, binding) ->        binding.mapInstance(person ->            () -> {              System.out.println("Start of greeting");              person.greet();              System.out.println("End of greeting");            }        ));  }}

该模块没有使用 @Provides 注解导出任何依赖关系。 相反,它重写了 AbstractModule#configure 方法,只是为了调用 transform(..) 方法。 让我们仔细看看 transform(...) 的调用。 它需要2个参数: - 一个将被转换的绑定的类(这可以改为一个 钥匙图案 来转换由一个键型匹配的所有绑定关系。 BindingTransformer<T> - 一个转化器,它本身就是一个功能接口,接收绑定、范围、当前键和绑定 ,并返回一个新的绑定(如果没有发生转化,则返回相同的绑定)。 我们在一个收到的绑定上调用 Binding#mapInstance 方法,并指定一个 Person 的实例应该如何被转化。 在这里,我们返回一个新的 Person 类的实例,在对原始person实例调用 person.greet() 之前和之后添加一些 System.out 记录。

启动实例#

为了启动这个例子,我们需要定义 main 方法,它将简单地创建一个我们的应用程序启动器的新实例,并将应用程序参数传递给 Launcher#launch 方法。

public static void main(String[] args) throws Exception {  BindingTransformationExample launcher = new BindingTransformationExample();  launcher.launch(args);}

当启动应用程序时,它应该打印到 stdout

问候语的开始你好!问候语结束

你可以在以下网站上找到实例来源 Github