我在spring应用程序中有类似的语法:
public OAuthClient getOAuthClient(String clientType, ClientConfig config){
switch (clientType) {
case "google":
return new GoogleOAuthClient(config);
case "facebook":
return new FacebookOauthClient(config);
case "linkedIn":
return new LinkedInOauthClient(config);
//... more clients
default:
return new BasicOauthClient(config);
}
}
如何使用Spring xml-configuration管理此类实例化?
答案 0 :(得分:2)
您可以自动装配实现或扩展OAuthClient的类列表。如果你有一个“getName()”方法,你将能够选择好的方法:
@Autowired
List<OAuthClient> clients;
public OAuthClient getOAuthClient(String clientType, ClientConfig config){
foreach (OAuthClient client : clients) {
if (client.getName().equals(clientType)) {
return client;
}
}
// Return null or throw exception
return null;
}
答案 1 :(得分:2)
有点不清楚你要做什么。但是,如果您希望将OAuthClient
作为托管bean并根据某些条件创建它,则可以使用factory。首先创建工厂类:
public class OAuthClientFactory{
public OAuthClient createOAuthClient(String clientType, ClientConfig config){
//Conditional creation logic...
}
}
现在在xml-configuration声明bean中:
<bean id="authClientFactory" class="com.somepackage.OAuthClientFactory"/>
<bean id="clientConfig" class="com.somepackage.ClientConfig"/>
<bean id="authClient" class="com.somepackage.OAuthClient " factory-bean="authClientFactory"
factory-method="createOAuthClient">
<constructor-arg value="google"/>
<constructor-arg ref="clientConfig"/>
</bean>
ClinetConfig
也必须是托管bean,以便将其作为参数传递给工厂方法。为了使示例更简单,我只是将其声明为bean,但在实际代码中,您应该决定如何创建它。
根据您上次的评论,您需要按需实例化客户端实例。并且您希望避免任何有条件的操作,并按照弹簧方式进行操作&#34;。然后,您应该将所有类型的客户端注册为具有相应名称的bean。
如果您每次请求新客户端时都需要创建新实例,则应将其声明为prototype
bean:
...
<bean id="googleClient" class="com.somepackage.GoogleOAuthClient" scope="prototype"/>
<bean id="facebookClient" class="com.somepackage.FacebookOauthClient" scope="prototype"/>
...
或者,如果您只需要每个请求客户端的一个(单例)实例,请将其声明为lazy-init
:
...
<bean id="googleClient" class="com.somepackage.GoogleOAuthClient" lazy-init="true"/>
<bean id="facebookClient" class="com.somepackage.FacebookOauthClient" lazy-init="true"/>
...
在这两种情况下,客户端的实例将仅按需求创建。现在,您可以通过ApplicationContext
:
@Service
public class SomeService{
@Autowired
private ApplicationContext context;
public void SomeMethod(){
ClientConfig config = ... //obtain client config
GoogleOAuthClient client = (GoogleOAuthClient)context.getBean("googleClient", config);
}
}
或者,如果您不使用基于注释的注入,请实施ApplicationContextAware界面以获取ApplicationContext
。