java中Provide类,java – Guice @Provides方法与提供者类

据我所知,它们与大多数简单案例完全相同.

/**

* Class-style provider.

* In module: bind(Foo.class).annotatedWith(Quux.class).toProvider(MyProvider.class);

*/

class MyProvider implements Provider {

@Inject Dep dep; // All sorts of injection work, including constructor injection.

@Override public Foo get() {

return dep.provisionFoo("bar", "baz");

}

}

/**

* Method-style provider. configure() can be empty, but doesn't have to be.

*/

class MyModule extends AbstractModule {

/** Name doesn't matter. Dep is injected automatically. */

@Provides @Quux public Foo createFoo(Dep dep) {

return dep.provisionFoo("bar", "baz");

}

@Override public void configure() { /* nothing needed in here */ }

}

在任何一种样式中,即使密钥绑定到类或实例,Guice也允许您注入Foo和Provider< Foo&gt ;.如果直接获取实例,Guice会自动调用get并创建隐式Provider< Foo>如果一个不存在.绑定注释在两种样式中都有效.

@Provides的主要优点是紧凑性,特别是与匿名内部Provider实现相比.但请注意,在某些情况下,您可能希望使用Provider类:

>您可以使用构造函数参数创建自己的长期Provider实例,并将键绑定到这些实例而不是类文字.

bind(Foo.class).toProvider(new FooProvisioner("bar", "baz"));

>如果您使用的是与JSR 330(javax.inject)兼容的框架,则可以轻松绑定到javax.inject.Provider类或实例. com.google.inject.Provider扩展了该界面.

bind(Foo.class).toProvider(SomeProviderThatDoesntKnowAboutGuice.class);

>您的提供商可能足够复杂,可以将其纳入自己的班级.根据您的测试结构,可能更容易以这种方式测试您的提供商.

>提供者可以扩展抽象类.使用@Provides方法执行此操作可能并不容易或直观.

>您可以直接将多个密钥绑定到同一个提供程序.每个@Provides方法只生成一个绑定,但您可以将其他键绑定到键(此处为@Quux Foo)并让Guice进行第二次查找.

>如果您希望(例如)在不使用Guice作用域或绑定的情况下缓存或记忆实例,则提供程序很容易进行装饰或换行.

bind(Foo.class).toProvider(new Cache(new FooProvisioner("bar", "baz")));

重要提示:虽然这对于Guice无法创建的类是一个很好的策略,但请记住,Guice可以自动创建并注入Provider< T>.对于以任何方式绑定的任何T,包括类名,键或实例.除非有您自己的实际逻辑,否则无需创建显式提供程序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值