我在我的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管理这样的实例化?
发布于 2016-12-27 22:59:53
您可以自动绑定实现或扩展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;
}发布于 2016-12-28 00:47:12
现在还不清楚你要做什么。但是,如果您希望使用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,但在实际代码中,您应该决定如何创建它。
根据您最后的评论,您需要按需实例化客户端实例。并且您希望避免任何条件操作,而使用"spring way“。然后,您应该将所有类型的客户端注册为具有相应名称的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。
https://stackoverflow.com/questions/41346980
复制相似问题