Spring實例化Bean的三種方式及Bean的類型

1.使用類構造器實例化  [默認的類構造器] html

<bean id=「orderService" class="cn.itcast.OrderServiceBean"/>

2.使用靜態工廠方法實例化  spring

<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>

public class OrderFactory {
    // 注意這裏的這個方法是 static 的!
    public static OrderServiceBean createOrder(){   
        return new OrderServiceBean();
    }
}

3.使用實例工廠方法實例化: app

<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源碼。 ide

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方法得到的。 post

總結:Spring中有三種實例化Bean的方式,類構造器實例化、靜態工廠方法實例化及實例工廠方法實例化。兩種Bean類型,一種是普通Bean,另外一種是工廠Bean,即FactoryBean,這兩種Bean都被容器管理,但工廠Bean跟普通Bean不一樣,其返回的對象不是指定類的一個實例,其返回的是該FactoryBean的getObject方法所返回的對象。在Spring框架內部,有不少地方有FactoryBean的實現類,它們在不少應用如(Spring的AOP、ORM、事務管理)及與其它第三框架(ehCache)集成時都有體現。ui

參考:Spring實例化Bean的三種方式及Bean的類型url

相關文章
相關標籤/搜索