目前我有一个带有applicationContext的spring项目.xml它定义了一些用于代码注入的bean:
<bean class="com.example.Example1ClientImpl">
<constructor-arg type="java.lang.String" value="${EXAMPLE1_URL}" />
</bean>
<bean class="com.example.Example2ClientImpl">
<constructor-arg type="java.lang.String" value="${EXAMPLE2_URL}" />
</bean>
我想将此代码重构为另一个不使用 spring 的项目。它运行在 JBoss 服务器上,所以我假设这些 bean 可以用 ejb-jar.xml
或 jboss-ejb3.xml
声明,但我无法弄清楚如何声明。
是否有可能做到这一点,有人可以给我一些关于如何做到这一点的指示吗?
编辑:示例XClientImpl类不是在项目本身中定义的,它们是在项目的依赖项中定义的。我可以适应这种依赖关系,但如果没有必要,我更喜欢。
如果你的目标是用这些豆子制作EJB,那么我会尝试混合使用xml和注释:
EJB-jar.xml
在这里定义环境属性:
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0" metadata-complete="false">
<enterprise-beans>
<session>
<ejb-name>Configuration</ejb-name>
<env-entry>
<env-entry-name>EXAMPLE1_URL</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>url1</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>EXAMPLE2_URL</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>url2</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
</ejb-jar>
Ejb
在这里,您可以创建一个Singleton
(因为这是默认的 Spring 范围(。如果你想让 bean 具有 EJB 的缺省prototype
作用域,那么你可以用 Stateless
来注释它:
import javax.annotation.Resource;
import javax.ejb.Singleton;
@Singleton
public class Example1ClientImpl{
@Resource(name = "EXAMPLE1_URL")
private String url;
...
}
@Singleton
public class Example2ClientImpl{
@Resource(name = "EXAMPLE2_URL")
private String url;
...
}
<</div>
div class="one_answers">我决定使用@Produces
,我忘记了它的存在。解决方案如下所示:
public class ClientProducer {
private static final String CLIENT1_ENDPOINT_VAR = "CLIENT1_URL";
private static final String CLIENT2_ENDPOINT_VAR = "CLIENT2_URL";
@Produces
public Example1Client produceExample1Client() {
String uri = System.getProperty(CLIENT1_ENDPOINT_VAR);
return new Example1ClientImpl(uri);
}
@Produces
public Example2Client produceExample2Client() {
String uri = System.getProperty(CLIENT2_ENDPOINT_VAR);
return new Example2ClientImpl(uri);
}
}