Spring核心技術之IOC容器(一):IOC容器與Bean簡介

最近開始研究Spring框架,今天學習Spring的核心內容IOC 與 Beanhtml

1. Spring IOC 與 Bean 簡介java

   Inversion of Control (IoC)即控制反轉,也叫dependency injection (DI)依賴注入,Spring實現了一個基於配置文件的複雜工廠模式來提供實現控制反轉。web

   org.springframework.beans 和org.springframework.context包是Spring中實現IOC的基礎包,其中BeanFactory接口提供一套基於配置文件來管理對象類型的機制,ApplicationContext接口繼承自BeanFactory接口,除了包含BeanFactory的全部功能以外,在國際化支持、資源訪問(如URL和文件)、事件傳播等方面進行了良好的支持,而WebApplicationContext是專門針對Web應用。
spring

  由Spring IOC管理、實例化、組裝的應用程序對象,稱爲Bean,Bean與Bean之間的依賴關係存放於Spring配置元數據中。api

2. Spring IOC容器框架

  org.springframework.context.ApplicationContex接口表明IOC容器,根據配置元數據來實現Bean的初始化、配置和裝配,配置數據能夠是XMl格式、Java註解格式或者Java代碼格式。
學習

  常見的實現ApplicationContext接口的類是ClassPathXMLApplicationContext和FileSystemXmlApplicationContext。ui

2.1 Spring IOC 配置實例this

  根據配置文件建立ApplicationContext:spa

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

  services.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.xsd">

  <!-- services -->

  <bean id="petStore"
        class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
    <property name="accountDao" ref="accountDao"/>
    <property name="itemDao" ref="itemDao"/>
    <!-- additional collaborators and configuration for this bean go here -->
  </bean>

  <!-- more bean definitions for services go here -->

</beans>

  daos.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.xsd">

  <bean id="accountDao"
      class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao">
    <!-- additional collaborators and configuration for this bean go here -->
  </bean>

  <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapItemDao">
    <!-- additional collaborators and configuration for this bean go here -->
  </bean>

  <!-- more bean definitions for data access objects go here -->

</beans>

  也能夠用<import>標籤把多個配置文件引用到一個配置文件中,以下

<beans>

    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>

</beans>

2.2.使用IOC容器建立對象

  使用ApplicationContext接口中的 T getBean(String name, Class<T> requiredType)方法能夠建立你想要的對象實例

// create and configure beans
ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});

// retrieve configured instance
PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);

// use configured instance
List userList = service.getUsernameList();

  事實上,咱們的應用應該不要直接調用getBean方法,所以能夠徹底不依賴於Sping的API,好比Spring和Web集成框架能夠直接將對象注入到web框架的Controller中。

3.Bean 

  Spring IOC容器管理着不少的Bean,這些Bean是根據配置數據而建立的,可是對於Spring IOC容器自己來講,這些Bean的配置數據最終使用BeanDefinition對象來表示,一個BeanDefinition包含以下一些數據:bean對應的類的徹底限定名、Bean的行爲(範圍、生命週期等)、與其餘Bean的依賴關係、其餘配置信息。

  Spring也容許手動加載外部對象,經過ApplicationContext的getBeanFactory方法獲取DefaultListableBeanFactory, 而後經過DefaultListableBeanFactory中的registerSingleton(...)或registerBeanDefinition(...)方法加載外部的對象。

  每一個Bean一般有一個標識符,全部的標識符在同一個容器內不能重複,xml配置中,能夠用id或name類標識一個bean,id屬性只能設置一個肯定的標識,而name屬性中能夠有多個標識符,用逗號分好或空格隔開。你也能夠不填id或name,那麼容器會自動生成一個標識符給bean。有時候,各個子系統但願用不一樣的名字訪問同一個bean,那麼你也可使用<alias>標籤在bean的外部爲他取一個別名,格式以下:

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />

  Spring能夠管理任何形式的Bean,不必定非要是標準的JavaBean。class屬性用來指定bean對應的class,以下:

<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>

3.1根據靜態工廠方法來建立bean

  若是你的bean須要根據特定的靜態工廠方法來建立,那麼你能夠這樣配置,其中class值的工廠方法所在的class,而不是工廠方法返回值的class,factory-method指定靜態工廠方法名

<bean id="clientService" class="examples.ClientService"  factory-method="createInstance"/>
public class ClientService {
  private static ClientService clientService = new ClientService();
  private ClientService() {}
  public static ClientService createInstance() {
    return clientService;
  }
}

3.2根據實例工廠方法來建立bean

根據實例工廠方法建立bean的配置,它根據另外一個bean來建立工廠方法對應的實例,使用factory-bean屬性來指定工廠方法所在的bean的名稱,以下:

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
  <!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
      factory-bean="serviceLocator"
      factory-method="createClientServiceInstance"/>
public class DefaultServiceLocator {
  private static ClientService clientService = new ClientServiceImpl();
  private DefaultServiceLocator() {}
  public ClientService createClientServiceInstance() {
    return clientService;
  }
}
相關文章
相關標籤/搜索