目前我有一个带有applicationContext.xml的spring项目,它定义了一些用于代码注入的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
中声明,但我无法弄清楚如何。
是否可以这样做,有人可以给我一些关于如何做到这一点的指示吗?
编辑:ExampleXClientImpl类未在项目本身中定义,它们是在项目的依赖项中定义的。我可以调整这种依赖性,但如果没有必要,我会更喜欢。
答案 0 :(得分:2)
如果您的目标是使EJB不在那些bean中,那么我会尝试混合使用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具有默认的prototype
范围的EJB,那么您可以使用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;
...
}
答案 1 :(得分:1)
我决定使用@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);
}
}