gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:00:31 25 4
gpt4 key购买 nike

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

最佳答案

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

public class OAuthClientFactory{
public OAuthClient createOAuthClient(String clientType, ClientConfig config){
//Conditional creation logic...
}
}

现在在 xml 配置中声明 beans:

<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);
}
}

或者,如果您不使用基于注释的注入(inject),则实现 ApplicationContextAware获取ApplicationContext的接口(interface)。

关于java - Spring:根据 String 参数实例化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com