同上一篇中靜態工廠類創建Bean類似,唯一不同的是工廠類中獲取實際對象的方法比如:getInstance() 不是靜態方法(non-static)。
工廠類代碼:
package factorybean;
import injection.MailConfig;
public class NonStaticMailConfigFactory
{
public MailConfig getMailConfig(String mailServiceProvider)
{
if ("companyOne".equals(mailServiceProvider))
return new MailConfigOfCompanyOne();
if ("companyTwo".equals(mailServiceProvider))
return new MailConfigOfCompanyTwo();
return null;
}
}
這個工廠類的方法與上一篇靜態工廠類創建Bean中的工廠類中獲取對象方法唯一區別就是它不是static的。
相對於使用static方法的工廠類,非靜態工廠類在Spring的XML配置也有一點不同。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 先定義工廠類的Bean -->
<bean id="mailConfigFactory" class="factorybean.StaticMailConfigFactory" />
<!-- 這裏factory-bean標籤屬性取上邊定義的工廠類的Bean的Id,然後通過factory-method標籤屬性定義此工廠類中用於獲取對象的非靜態方法 -->
<bean name="mailConifg"
factory-bean="mailConfigFactory"
factory-method="getMailConfig"
<constructor-arg value="companyTwo" />
<!-- 如上,仍然使用constructor-arg標籤定義工廠類獲取對象方法的參數 -->
</bean>
</beans>
靜態方法工廠類創建Bean中有比較詳細的完整代碼參考:http://blog.csdn.net/arvinrong/article/details/7734709
Client代碼中獲取該類的方法仍沒有改變:
MailConfig mailConfig = context.getBean("mailConfig", MailConfig.class);