1.使用類構造器實例化 [默認的類構造器]
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用靜態工廠方法實例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/> public class OrderFactory { // 注意這里的這個方法是 static 的! public static OrderServiceBean createOrder(){ return new OrderServiceBean(); } }
3.使用實例工廠方法實例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/> <bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/> public class OrderFactory { public OrderServiceBean createOrder(){ return new OrderServiceBean(); } }
在BAMS中,工作流引擎activiti的各個組件就是使用此方式實例化的。
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
<bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
使用工廠實例化的Bean跟普通Bean不同,其返回的對象不是指定類的一個實例,其返回的是該FactoryBean的getObject方法所返回的對象。以下為ProcessEngineFactoryBean源碼。
public class ProcessEngineFactoryBean implements FactoryBean<ProcessEngine> ..{ ... protected ProcessEngineImpl processEngine; public ProcessEngine getObject() throws Exception { initializeExpressionManager(); initializeTransactionExternallyManaged(); if (processEngineConfiguration.getBeans()==null) { processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(applicationContext)); } processEngine = (ProcessEngineImpl) processEngineConfiguration.buildProcessEngine(); return processEngine; } ... }
ProcessEngineFactoryBean最終返回的是processEngine對象,repositoryService、runtimeService、formService等等組件都是通過processEngine里的getXX方法獲得的。
總結:Spring中有三種實例化Bean的方式,類構造器實例化、靜態工廠方法實例化及實例工廠方法實例化。兩種Bean類型,一種是普通Bean,另一種是工廠Bean,即FactoryBean,這兩種Bean都被容器管理,但工廠Bean跟普通Bean不同,其返回的對象不是指定類的一個實例,其返回的是該FactoryBean的getObject方法所返回的對象。在Spring框架內部,有很多地方有FactoryBean的實現類,它們在很多應用如(Spring的AOP、ORM、事務管理)及與其它第三框架(ehCache)集成時都有體現。