1.使用類構造器實例化 [默認的類構造器]spring
<bean id=「orderService" class="cn.itcast.OrderServiceBean"/>
2.使用靜態工廠方法實例化 app
<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的各個組件就是使用此方式實例化的。 ide
<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源碼。ui
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方法得到的。spa
總結:Spring中有三種實例化Bean的方式,類構造器實例化、靜態工廠方法實例化及實例工廠方法實例化。兩種Bean類型,一種是普通Bean,另外一種是工廠Bean,即FactoryBean,這兩種Bean都被容器管理,但工廠Bean跟普通Bean不一樣,其返回的對象不是指定類的一個實例,其返回的是該FactoryBean的getObject方法所返回的對象。在Spring框架內部,有不少地方有FactoryBean的實現類,它們在不少應用如(Spring的AOP、ORM、事務管理)及與其它第三框架(ehCache)集成時都有體現。code