Spring:根据String参数实例化一个类

时间:2016-12-27 14:27:36

标签: java spring

我在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管理此类实例化?

2 个答案:

答案 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