在托管bean中,@PostConstruct在常规Java对象构造函数之后调用.
我为什么要使用@PostConstructbean初始化,而不是常规构造函数本身?
我们有一种情况,我们以Map的形式为我们正在运行的程序提供外部配置.我发现JSR-330依赖注入提供了一种更清晰的方式来在代码中使用该配置映射,而不是传递映射或使用JNDI来获取它.
@Inject @Named("server.username") String username;
Run Code Online (Sandbox Code Playgroud)
让JSR-330实现自动填写此字段.
使用Guice,我可以设置值
bindConstant().annotatedWith(Names.named(key)).to(value);
Run Code Online (Sandbox Code Playgroud)
我希望能够在Weld中做同样的事情(将"server.username"绑定到例如"foobar")并且我理解该机制最有可能是beans.xml,但我更喜欢简单的"将此地图提供给Weld" ,请"代码替代.这样做有什么好办法?
编辑2013-10-16:在调查Dagger,它在编译时工作而不是运行时,我发现我们通常每个程序有10-20个,我们可以使用@Provider每个配置字符串的方法,然后在配置中查找地图.这允许方法特定的行为(包括默认值),提供javadoc的能力,以及将所有这些方法放在同一个类中的能力.它也可以与Weld开箱即用.我正在考虑在博客文章中写一个更全面的解释.
如何使用JSR-299 CDI从外部库中注入(未注释)bean?
例子:
接口X及其实现来自第三方lib.我如何决定使用哪种实现?
class A {
@Inject
private X x;
}
Run Code Online (Sandbox Code Playgroud)
如果我有几个类使用X接口但不同的实现怎么办?
class A {
@Inject
private X x; // should be XDefaultImpl
}
class B {
@Inject
private X x; // should be XSpecialImpl
}
Run Code Online (Sandbox Code Playgroud) 我知道它仍然不太受欢迎,因为该规范是在几个月前发布的.
我还没有"安装"焊接,我只是在阅读,通过这个问题,我想确保我理解这个重要的观点是正确的:
第三方罐子中的咖啡豆的解析是通过<alternatives>在你的身上宣布它们来实现的beans.xml吗?
如果没有,如何使用第三方库中没有的bean beans.xml?
将jar放在类路径上是行不通的,除非beans.xml它们存在META-INF,否则你无法为第三方罐子做到这一点.(参见Gavin King关于这个主题的帖子)
在Spring中,可以通过在xml conf中定义相应的bean来实例化任何类.也可以为具有不同参数的同一个类实例化多个bean ...
CDI中的这些功能也是如此,即是否可以使用不同的初始化参数创建同一类的不同实例?
是否也可以在不更改类的情况下创建bean ....我的意思是不添加注释?
添加
让我举个例子.
<bean id="someBean1" class="org.mm.MyBean">
<property name="x" value="xx"/>
<property name="y" value="yy"/>
<property name="z" value="zz"/>
</bean>
<bean id="someBean2" class="org.mm.MyBean">
<property name="x" value="other value"/>
<property name="y" value="yy2"/>
<property name="z" value="zz2"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
如何实例化同一个类的两个实例并使用不同的字段值初始化它们?
我从几个网页中注意到,显然Spring 3.0支持JSR-330的@Inject.由于我们真的想在我们的库中为Web应用程序和独立应用程序使用JSR-299语法进行依赖项注入,并且可以选择Weld,如果Spring可以做到这一点会很好.
作为Spring的新手,我尝试下载Spring Framework发行版并将所有jar放在Eclipse构建路径上.No Inject annotation所以我使用Weld的现有测试项目没有编译.
这可以用Spring完成吗?要让它运行,我需要做什么?
(我知道Guice最终也会支持这个.现在只在SVN中使用,如果有正式的Spring版本可以,那会更好.)
可以办到.必须单独下载JSR-330 jar,并使用cglib解析手动编写的@Configuration类,以及公共日志记录实现.
与Weld最大的区别似乎是布线需要手动编写而不是神奇地找到(更麻烦,但可能会使应用程序更加强大),再加上启动时间要少得多.我还是Spring的新手 - 有没有办法让@Configuration类自动发现?
我的部分问题是使用适当的词汇表,所以我提前道歉可能是一个简单的术语问题.
假设我有一个Person接口,以及一个PersonBean实现该接口的类.
假设我在某处(注释@Produces)有一个返回a 的生成器方法Person.在内部它返回一个新的PersonBean,但这既不在这里也不在那里.
最后,假设我有另一个CDI bean,其注入点定义如下:
@Inject
private Person person;
Run Code Online (Sandbox Code Playgroud)
假设我已经将我的所有beans.xml文件都放在适当的位置,并且已经引导了Weld或其他符合CDI-1.0标准的环境,因为这一切都将导致模糊的定义错误.这是有道理的:Weld将找到我PersonBean作为注入的候选者(它可以只调用构造函数)并且将找到我的producer方法的输出作为注入的候选者.
我想要做的是以某种方式强制Person在此应用程序中生成实例始终路由生成器方法.
我知道我可以在某处创建一些限定符,并使生成器方法生成Person由该限定符限定的实例.如果我这样做,并改变我的注射点以包括限定符,那么显然这些合格的注射剂只有一个来源(即我的生产者方法),所以瞧,问题解决了.
但是假设我不想发明一些虚假的限定词.(我不是说这是事实;只是想更深入地了解这些问题.)我有什么选择?我有吗?我想我可以把@Typed(Object.class)在PersonBean做出这等,这是不看作是一个Person由CDI ....
欢迎任何想法,包括指向文档,或更好地理解这一点.谢谢.