有没有人举例说明如何使用Google Guice从.properties文件中注入属性.我被告知Guice能够验证喷射器启动时是否存在所有需要的属性.
这时我在guice维基上找不到任何关于此事的内容.
我有这门课:
public class House {
private final Door door;
private final Window window;
private final Roof roof;
@Inject
public House(Door door, Window window, Roof roof) {
this.door = door;
this.window = window;
this.roof = roof;
}
}
Run Code Online (Sandbox Code Playgroud)
其中Door,Window和Roof是具体的类.现在,如果我想为这个场景实现一个模块,我会这样做:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
bind(Door.class).to(Door.class);
bind(Window.class).to(Window.class);
bind(Roof.class).to(Roof.class);
}
}
Run Code Online (Sandbox Code Playgroud)
但我想知道这是否是绑定具体类的正确方法,或者是否有更简单的方法.我觉得有一种更简单的方法.
编辑
刚试了这个,它似乎不起作用:
1) Binding points to itself.
at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10)
Run Code Online (Sandbox Code Playgroud)
编辑2
似乎根本不需要绑定:
Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class); …Run Code Online (Sandbox Code Playgroud) 什么方法install()从AbstractModule类呢?有人可以向我解释一下吗?从我从guice网站上读到的文档我得到的只是:
使用给定的模块配置更多绑定.
准确配置什么绑定?来自已安装模块的绑定或调用install方法的类的绑定?
首先是一些背景:
我正在开发一些基于Apache Sling的 webapp原型代码,它基于OSGI并在Apache Felix上运行.尽管我认为我现在已经掌握了大部分概念,但我对OSGI仍然相对较新.然而,令我困惑的是,我无法找到"完整"依赖注入(DI)框架.我使用声明服务(DS)成功地使用了基本的DI.但我的理解是DS用于引用 - 我该怎么说呢? - OSGI将注册的服务和组件放在一起.为此,它工作正常,但我个人使用像Guice这样的DI框架将整个对象图连接在一起,并将对象放在正确的范围内(想想@RequestScoped或者@SessionScoped例如).但是,我所看到的OSGI特定框架似乎都没有支持这个概念.
我开始阅读有关OSGI蓝图和iPOJO的内容,但这些框架似乎更关注将OSGI服务连接在一起,而不是提供完整的DI解决方案.我不得不承认我还没有做任何样品,所以我的印象可能不正确.
作为Guice的扩展,我已经尝试了Peaberry,但是我发现文档很难找到,而且当我得到基本的DI工作时,很多guice-servlet的高级功能(自动注入过滤器,servlet等)没有'干活了.
所以,我的问题如下:
抱歉这个相当长的问题.
任何反馈都非常感谢.
更新
范围注入:范围注入是一种有用的机制,可以自动注入特定生命周期中的对象.例如,您的一些代码依赖于作为servlet过滤器的一部分创建的Hibernate会话对象.通过标记依赖关系,容器将自动重建对象图.也许只有不同的方法呢?
JSR 330 vs DS:从你所有出色的答案中我看到这些是两个不同的东西.这提出了一个问题,如何处理在OSGI上下文中使用时使用JSR 330注释的第三方库和框架?什么是好方法?在Bundle中运行JSR 330容器?
我感谢您的所有答案,您一直非常乐于助人!
假设我想在我的项目中添加guice-assistedinject作为依赖项.它将guice工件指定为依赖本身.如何告诉它使用no_aop版本的guice?
我知道我可以做到以下几点,但我可以一步完成而不排除guice模块吗?
dependencies {
compile (group: 'com.google.inject.extensions', name: 'guice-assistedinject', version: '3.0') {
exclude module: 'guice'
}
compile group: 'com.google.inject', name: 'guice', version: '3.0', classifier: 'no_aop'
}
Run Code Online (Sandbox Code Playgroud) java dependency-injection guice dependency-management gradle
据我所知,Google Guice 2.0已经不久前出现了.但是我看到中央回购仍然已经过时了1.0版本.请告诉我在哪里可以找到使用Google Guice 2.0的maven2存储库.
我已经阅读了关于Google Guice的内容,并了解了其他依赖注入方法的一般问题,但是我还没有看到有人在实践中使用Guice的例子,其价值变得清晰.
我想知道是否有人知道任何这样的例子?
我不确定这个问题是否有用,但Google Guice是否有任何最佳实践和反模式?
请将任何通用DI模式指向此问题.
注释变得流行.Spring-3支持它们.CDI严重依赖它们(我不能在没有注释的情况下使用CDI,对吧?)
我的问题是为什么?
我听到几个问题:
"它有助于摆脱XML".但是xml有什么不好的?依赖性本质上是声明性的,XML对于声明非常有用(对于命令式编程来说非常糟糕).有了很好的IDE(就像想法一样),编辑和验证xml非常容易,不是吗?
"在许多情况下,每个接口只有一个实现".那不是真的!我系统中的几乎所有接口都具有用于测试的模拟实现.
还有其他问题吗?
现在我的XML优势:
你可以在任何地方注入任何东西(不仅是带有注释的代码)
如果我有一个接口的多个实现,我该怎么办?使用限定符?但它迫使我的班级知道它需要什么样的注射.它不适合设计.
基于XML的DI使我的代码清晰:每个类都不知道注入,所以我可以配置它并以任何方式对它进行单元测试.
你怎么看?
我从我的代码中得到一个奇怪的运行时错误:
"Found interface [SomeInterface] but class was expected"
Run Code Online (Sandbox Code Playgroud)
怎么会发生这种情况?如何实例化接口?
更新:(针对一些答案)我编译,并用同样的程序库的运行,但我正在用吉斯注入这个特定接口的提供者.
当我将一个实现绑定到接口时,问题就消失了(似乎@ImplementedBy注释还不够).
我对Guice设法实际实例化接口的机制更感兴趣.