首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring:根据字符串参数实例化一个类

Spring:根据字符串参数实例化一个类
EN

Stack Overflow用户
提问于 2016-12-27 22:27:36
回答 2查看 993关注 0票数 0

我在我的spring应用程序中有一个与此类似的语法:

代码语言:javascript
复制
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管理这样的实例化?

EN

回答 2

Stack Overflow用户

发布于 2016-12-27 22:59:53

您可以自动绑定实现或扩展OAuthClient的类的列表。例如,如果你有一个"getName()“方法,你就可以选择好的方法:

代码语言:javascript
复制
@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;
}
票数 2
EN

Stack Overflow用户

发布于 2016-12-28 00:47:12

现在还不清楚你要做什么。但是,如果您希望使用OAuthClient作为托管bean,并根据某些条件创建它,则可以使用factory。首先创建工厂类:

代码语言:javascript
复制
public class OAuthClientFactory{
    public OAuthClient createOAuthClient(String clientType, ClientConfig config){
       //Conditional creation logic...
    } 
}

现在,在xml-configuration声明bean中:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
...
<bean id="googleClient" class="com.somepackage.GoogleOAuthClient" scope="prototype"/>
<bean id="facebookClient" class="com.somepackage.FacebookOauthClient" scope="prototype"/>
...

或者,如果您只需要每个被请求客户端的一个(单例)实例,则将其声明为lazy-init

代码语言:javascript
复制
...
<bean id="googleClient" class="com.somepackage.GoogleOAuthClient" lazy-init="true"/>
<bean id="facebookClient" class="com.somepackage.FacebookOauthClient" lazy-init="true"/>
...

在这两种情况下,客户端的实例将仅按需创建。现在,您可以通过向ApplicationContext请求来获取客户端实例

代码语言:javascript
复制
@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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41346980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档