我刚开始玩Guice,我能想到的一个用例是在测试中我只想覆盖单个绑定.我想我想使用其余的生产级别绑定来确保正确设置所有内容并避免重复.
所以想象我有以下模块
public class ProductionModule implements Module {
public void configure(Binder binder) {
binder.bind(InterfaceA.class).to(ConcreteA.class);
binder.bind(InterfaceB.class).to(ConcreteB.class);
binder.bind(InterfaceC.class).to(ConcreteC.class);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我只想覆盖InterfaceC,同时保持InterfaceA和InterfaceB,所以我想要像:
Module testModule = new Module() {
public void configure(Binder binder) {
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(new ProductionModule(), testModule);
Run Code Online (Sandbox Code Playgroud)
我也试过以下,没有运气:
Module testModule = new ProductionModule() {
public void configure(Binder binder) {
super.configure(binder);
binder.bind(InterfaceC.class).to(MockC.class);
}
};
Guice.createInjector(testModule);
Run Code Online (Sandbox Code Playgroud)
有谁知道是否有可能做我想做的事情,或者我完全咆哮错误的树?
---跟进:如果我在接口上使用@ImplementedBy标记,然后在测试用例中提供一个绑定,看起来我可以实现我想要的,当它之间存在1-1映射时,它可以很好地工作界面和实现.
此外,在与同事讨论之后,似乎我们将推翻覆盖整个模块并确保正确定义模块.这似乎可能会导致问题,虽然绑定在模块中放错位置并需要移动,因此可能会破坏大量测试,因为绑定可能不再可用于覆盖.
我一直在使用Guice的AOP来拦截一些方法调用.我的类实现了一个接口,我想注释接口方法,以便Guice可以选择正确的方法.即使注释类型使用Inherited annotation注释,实现类也不会继承Inherited的java doc中所述的注释:
另请注意,此元注释仅导致注释从超类继承; 已实现接口上的注释无效.
这可能是什么原因?了解对象类在运行时实现的所有接口并不是一件难事,因此必须有充分的理由支持这一决策.
我的团队正在研究依赖注入框架,并试图决定使用Google-Guice和PicoContainer.
我们正在寻找框架中的几件事:
将非常感谢两个框架与所列标准的比较.任何有助于比较两者的个人经历也会非常有帮助.
免责声明:我对依赖注入相当新,如果我问一个与本次讨论无关的问题,请原谅我的新闻.
假设我有一个模块:
Module extends AbstractModule
{
@Override
protected void configure()
{
bind(String.class).
annotatedWith(Names.named("annotation")).
toInstance("DELIRIOUS");
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试模块并检查它是否在没有类和String字段的注释字段中注入正确的值Names.named("annotation")但是直接从注入器获取值:
@Test
public void test()
{
Injector injector = Guice.createInjector(new Module());
// THIS IS NOT GOING TO WORK!
String delirious = injector.getInstance(String.class);
assertThat(delirious, IsEqual.equalTo("DELIRIOUS");
}
Run Code Online (Sandbox Code Playgroud) 我已阅读https://github.com/google/guice/wiki/AssistedInject,但它没有说明如何传递AssistedInject参数的值.injector.getInstance()调用会是什么样的?
从我在网上看到的情况来看,Guice + Jersey整合的最新技术水平自2008年以来一直停滞不前,似乎两支球队都陷入了僵局.问题的关键在于JAX-RS注释执行字段和方法注入,这与Guice自己的依赖注入不能很好地协作.
我发现的一些例子远远不足以阐明:
Iqbalyusuf 在Google App Engine上发布关于Jersey + Guice的帖子Java遭受了大量的样板(手动获取和调用注入器).我希望绑定和注入应该通过Guice注释在幕后发生.
Jonathan Curran的文章使用Jersey,Guice和JSR-250创建一个RESTful服务给了我希望,因为它更新(2010),但没有比显示如何在Guice ServletModule中启动Jersey服务更进一步.但是,没有任何实例依赖注入的例子.我想这是留给读者的练习.Curran的帖子实际上可能是连接Guice和Jersey的正确的第一步,所以我打算从那开始.
令人着迷的詹姆斯斯特拉坎写道:
JAX-RS适用于依赖注入框架,如Spring,Guice,GuiceyFruit或JBossMC - 你基本上可以选择你喜欢的任何一个.
但是,从实践者的角度来看,我没有看到任何证据.
我发现缺少的是关于如何组合JAX-RS和Guice注释的实际示例和解释.例如:
有没有人有一些非平凡的应用程序的例子,最好是源代码,它结合了Jersey和Guice,而不会在这个过程中牺牲一个或另一个?无论如何我都会坚持这条道路,但泽西和吉斯的名单上的点点滴滴让我觉得我正在重复在我面前的其他人的工作.
是否有可能告诉Guice在定时给定类型的对象后调用某个方法(即init())?
我在EJB 3中寻找类似于@PostConstruct注释的功能.
我希望能够使用Guice注入通用接口的通用实现.
public interface Repository<T> {
void save(T item);
T get(int id);
}
public MyRepository<T> implements Repository<T> {
@Override
public void save(T item) {
// do saving
return item;
}
@Override
public T get(int id) {
// get item and return
}
}
Run Code Online (Sandbox Code Playgroud)
在C#中使用Castle.Windsor,我可以做到:
Component.For(typeof(Repository<>)).ImplementedBy(typeof(MyRepository<>))
Run Code Online (Sandbox Code Playgroud)
但我不认为Guice中存在等价物.我知道我可以TypeLiteral在Guice 中使用来注册个人实现,但是有没有办法像Windsor那样一次注册它们?
编辑:
这是一个用法示例:
Injector injector = Guice.createInjector(new MyModule());
Repository<Class1> repo1 = injector.getInstance(new Key<Repository<Class1>>() {});
Repository<Class2> repo2 = injector.getInstance(new Key<Repository<Class2>>() {});
Run Code Online (Sandbox Code Playgroud)
虽然更可能的用法是注入另一个类:
public class ClassThatUsesRepository {
private Repository<Class1> repository;
@Inject
public ClassThatUsesRepository(Repository<Class1> …Run Code Online (Sandbox Code Playgroud) javax.inject注释是否可以作为com.google.inject的直接替换?
所以,如果我用javax.inject替换所有我当前的guice/gin注释,我的应用程序将编译并运行得很好?
首先,javax.inject是否覆盖了google.inject所涵盖的所有基础?
据我所知,Dagger确实生成了代码,而Guice和Spring依赖于运行时处理,因此Dagger的工作速度更快,但需要在程序员方面做更多的工作.由于性能优势,它对移动(Android)开发很有好处.
然而,当我们离开Guice和Spring时,后者有很多集成.如果我们可以使用Spring Framework(基本上做同样的事情,但提供更简单的数据库访问),那么开发/使用Guice有什么意义呢?
谷歌是不是试图通过创建自己的DI工具来重新发明轮子,而不是使用(并可能有助于)Spring Framework?
我正在寻找决策树,通过选择DI工具来指导.
guice ×10
java ×9
annotations ×2
dagger-2 ×1
guice-3 ×1
gwt ×1
gwt-gin ×1
inheritance ×1
init ×1
interface ×1
jax-rs ×1
jersey ×1
jsr330 ×1
spring ×1
typeliteral ×1
unit-testing ×1