有點兒不清楚你打算做什麼。但是,如果您想將OAuthClient
作爲託管bean及其基於某些條件的創建,則可以使用工廠。首先,創建工廠類:
public class OAuthClientFactory{
public OAuthClient createOAuthClient(String clientType, ClientConfig config){
//Conditional creation logic...
}
}
現在XML的配置聲明豆:
<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,但在實際代碼中,您應該決定如何創建它。
根據您最後的評論,您需要按需實例化客戶端實例。你想避免任何有條件的操作,並通過「春天的方式」。然後,你應該註冊所有類型的客戶端爲具有相應名稱的bean。
如果您需要在每次新的客戶端請求時創建新實例,你應該把它聲明爲prototype
豆:
...
<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
。
方法中沒有返回類型 –
代碼中缺少返回類型。 – mm759
謝謝,更正 –