我打算开始一个新项目,并且正在研究当前最先进的Java Web框架.我决定围绕Guice构建我的应用程序,并且可能使用像Squill/JEQUEL/JaQu或类似的非常轻量级的ORM,但我无法决定Web框架.哪一个最适合这种轻量级环境?哪一个最好与Guice整合?
我喜欢Guice如此直接地手动创建自己的模块的方式,每个模块都有自己的代码绑定.另一方面,CDI似乎更多地依赖于魔术而不是程序化访问sest绑定.我错了,或者如何用WELD达到同样的效果.
任何代码示例将不胜感激......
我希望使用Guice在http://code.google.com/p/google-guice/上提供的构建器模式样式,以编程方式构建一个模块(Guice术语,我不确定CDI术语).
我正在构建一个动态系统,我需要能够绑定类型(如接口),常量等,而不仅仅是让Weld动态扫描类路径等并查找和注册类型.我相信CDI是静态的,javax.inject包不包含允许以编程方式将类型绑定到实现的任何接口.
原始问题的基本前提是简单的观察,即注释被烘焙,并且在其中定义的规则可以帮助无法更改注释器.我最初希望公共访问CDI类路径扫描程序用于构建内部使用定义的相同接口.基本上我说的是,我想要一个允许我读取注释并为容器创建定义的图层.默认提供程序可以是执行现在发生的操作的提供程序,但如果您需要其他策略,则可以执行此操作.
当前方法的一个问题是不能重用具有不同注释的组件(类)来选择不同的协作者的限制.在您跳转之前让我对此声明进行限定,是的,可以通过提供商等来完成,但这会导致更多的工件.应该有一个更简单的方法.
很抱歉,如果这个例子不好,我的用例就会更加复杂,细节也会受到阻碍,并且需要更长时间的阅读.
想象一下有一个url重写组件,为了论证,有一些参数,如
如果您希望使用两个不同的替换规则注入相同的组件但是使用html清洁器注入器,则卡住了.当然有办法解决这个问题,但他们需要人工制品,这当然是更多的代码.
遗憾的是,所有绑定规则都在类而不是实例上,因此每次你要求一个类时,你都会得到几乎相当于实例的实例.
这个问题是在一段时间之前写的,我已经放弃了Weld.我相信它决定魔术如何完成的方式是错误的.我不喜欢这样的事实,即如果没有为我提供控制何时或如何重复此操作的方法,他们会向我发出这种情况.我不喜欢这种不灵活性.
使用Guice,在每个JUnit测试类中获取一个新的注入器是一个好习惯,因为每个测试类应该是独立的吗?
在CDI中,您可以使用以下命令定义一个对象,该对象将为您提供特定类型的项目:
@Inject Instance<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
同样在Guice中你可以做到:
@Inject Provider<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
我想知道Spring中是否有类似的构造,或者你必须使用它ApplicationContext才能获得引用?
我想在Java应用程序中实现动态插件功能.理想的情况是:
Plugin使用类似的方法定义接口getCapabilities().pluginX.jar包含PluginXImpl实现Plugin(可能还有其他一些)的类的JAR .pluginX.jar特殊目录或设置指向它的配置参数.用户不一定必须包含pluginX.jar在他们的类路径中.PluginXImpl(可能通过JAR清单,可能通过反射)并将其添加到注册表中.PluginXImpl例如通过调用类似的方法来获取实例getPluginWithCapabilities("X").用户不一定必须知道插件的名称.我有一种感觉,我应该能够用peaberry做到这一点,但我无法理解文档.我花了一些时间学习Guice,所以我的首选答案不是"使用Spring Dynamic Modules".
任何人都可以给我一个简单的想法,如何使用Guice/peaberry,OSGi,或只是简单的Java?
作为一名Java开发人员,我已经习惯于在应用程序中使用依赖注入.对于Android,我对性能特别警惕.在Android应用中使用Guice有什么性能影响?我假设有一些开销,但它是否足够重要,我应该避免使用Guice?
我对它的使用可能只是将一些共享对象注入到各种活动中.
我已经在使用Guice作为我的应用程序的数据模型,到目前为止我对此非常满意.然而,GUI部分即将成为一个泥球大球.我觉得这里很难使用Guice,因为Swing组件和模型紧密耦合,并且经常强制执行某个初始化顺序.
我的应用程序基本上包含一个包含大量过滤器的标题,一个中心且非常复杂的JTree组件,以及许多操作(例如来自JPopup),菜单,对话框,向导等.主要问题是我有很多组件和动作之间的耦合(例如复杂的验证,树更新......).你能给我一些如何用Guice构建GUI的建议吗?
我知道像GUTS这样的库,但文档很薄,我宁愿避免在我的项目中添加另一个依赖项并学习另一个API(例如我不知道Swing应用程序框架).
使用Spring,您可以定义一个数组属性,并让Spring注入从给定类型派生的每个(@Component)类中的一个.
在Guice中有相同的效果吗?或者是一个添加此行为的扩展点?
我有一个通用的数据库访问类,我使用TypeLiteral结构进行绑定.现在在测试中我想模拟该类,并且我已经创建了一个Provider,它创建了一个模拟实例.在我的测试中,我想访问该模拟来定义其行为.现在的问题是,我如何从注射器中检索物体?
这是我的约束定义:
binder.bind(new TypeLiteral<GenericDbClass<Integer>>(){}).GenericDbClassProvider.class);
Run Code Online (Sandbox Code Playgroud)
通常我会得到这样的实例:
injector.getInstance(GenericDbClass.class);
Run Code Online (Sandbox Code Playgroud)
但由于我没有将GenericDbClass的实现绑定到接口本身,我不知道该怎么做.我认为复杂吗?
任何想法/帮助非常感谢!
我能够使下面的通用方法工作的唯一方法是传递看似冗余的TypeLiteral<Set<T>>参数.我认为应该可以在给定其他参数的情况下以编程方式构造此参数,但无法弄清楚如何.
protected <T> Key<Set<T>> bindMultibinder(
TypeLiteral<Set<T>> superClassSet, TypeLiteral<T> superClass) {
final Key<Set<T>> multibinderKey = Key.get(superClassSet, randomAnnotation);
return multibinderKey;
}
Run Code Online (Sandbox Code Playgroud)
客户端代码如下:
bindMultibinder(new TypeLiteral<Set<A<B>>>(){}, new TypeLiteral<A<B>>(){});
Run Code Online (Sandbox Code Playgroud)
其中A和B是接口.
如果我尝试以下(删除TypeLiteral<Set<T>> superClassSet参数),我会收到java.util.Set<T> cannot be used as a key; It is not fully specified.运行时错误.
protected <T> Key<Set<T>> bindMultibinder(TypeLiteral<T> superClass) {
final Key<Set<T>> multibinderKey = Key.get(
new TypeLiteral<Set<T>>() {}, randomAnnotation);
return multibinderKey;
}
Run Code Online (Sandbox Code Playgroud)