(5)ioc容器概述

weixin_33924312發表於2018-09-13

該介面org.springframework.context.ApplicationContext代表Spring IoC容器,負責例項化,配置和組裝bean。容器通過讀取配置後設資料獲取有關要例項化,配置和組裝的物件的指令。配置後設資料以XML,Java註釋或Java程式碼表示。它允許您表達組成應用程式的物件以及這些物件之間豐富的相互依賴性。

ApplicationContextSpring的開箱即用的幾個介面實現。在獨立應用程式中,通常建立ClassPathXmlApplicationContext 或的例項FileSystemXmlApplicationContext

雖然XML是定義配置後設資料的傳統格式,但您可以通過提供少量XML配置來宣告性地支援這些其他後設資料格式,從而指示容器使用Java註釋或程式碼作為後設資料格式。

接下來就開始演示ioc容器如何使用

1.配置後設資料

演示的例子描述了Person的業務層訪問 personDao層,personDao層成訪問實體類的例子

對應person的實體類

/**
 * @Project: spring
 * @description:  person實體類
 * @author: sunkang
 * @create: 2018-09-11 10:42
 * @ModificationHistory who      when       What
 **/
public class Person {

    private  String  username;
    private int age;
    private String addr;

    public Person(String username, int age, String addr) {
        this.username = username;
        this.age = age;
        this.addr = addr;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    @Override
    public String toString() {
        return "Person{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", addr='" + addr + '\'' +
                '}';
    }
}

接下來是person的dao層

/**
 * @Project: spring
 * @description:  person 資料訪問層
 * @author: sunkang
 * @create: 2018-09-11 10:51
 * @ModificationHistory who      when       What
 **/
public class PersonDao {
    public Person findPersonByUsername(String username){
        return  new Person(username,20,"hangzhou");
    }
}

接下來是業務層

/**
 * @Project: spring
 * @description:  person 業務處理類
 * @author: sunkang
 * @create: 2018-09-11 10:50
 * @ModificationHistory who      when       What
 **/
public class PersonService {
    private PersonDao personDao;

    private String serviceName;

    public Person findPersonByUsername(String userName){
        return personDao.findPersonByUsername(userName);
    }

    public PersonDao getPersonDao() {
        return personDao;
    }

    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }

    public String getServiceName() {
        return serviceName;
    }

    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }
}

想想person的業務層如何dao層如何進行關聯呢?

接下來看看在xml的具體配置
PersonDao在spring-dao.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="personDao" class="com.spring.ContailerOverview.PersonDao"/>

</beans>

PersonService在spring-service.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="personService" class="com.spring.ContailerOverview.PersonService">
        <!-- collaborators and configuration for this bean go here -->
        <property name="personDao" ref="personDao"/>
        <property name="serviceName" value="person的service層"/>
    </bean>
</beans>

配置瞭解完了,接下來,瞭解如何進行載入配置,並完成ioc的載入,
想想如何同時載入spring-dao.xml和spring-service.xml的配置

2.例項化容器 和使用容器

在講解例項化容器之前,比如我有多個xml配置,我想放到一起組合載入該如何配置

可以使用import可以引入多個檔案載入bean定義
在spring-compose.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">
    <!--對之前的連個檔案進行組合-->
    <import resource="spring-dao.xml"/>
    <import resource="spring-service.xml"/>
</beans>

其實除了普通的xml配置之外,spring還支援Groovy Bean定義DSL,這個該如何配置
groovy-dao.groovy描述了personDao這個類的配置方法

package ContailerOverview

import com.spring.ContailerOverview.PersonDao

beans {
    personDao(PersonDao) {
    }
}

groovy-service.groovy描述了personService這個類的配置方法

package ContailerOverview

import com.spring.ContailerOverview.PersonService

beans {
    personService(PersonService) {
        serviceName = "personService"
        personDao = personDao
    }

}

接下來一起來看如何使用ioc容器來載入普通xml的配置和groovy檔案的配置

載入普通xml配置有下面的幾種方式:

  • 可以用ClassPathXmlApplicationContext載入classPath路徑完成容器載入
  • 可以用FileSystemXmlApplicationContext 系統路徑載入容器
  • 可以用GenericApplicationContext和XmlBeanDefinitionReader結合使用來載入

載入groovy檔案配置可以用使用

  • 使用GenericGroovyApplicationContext的容器里載入
  • 使用GenericApplicationContext和GroovyBeanDefinitionReader結合使用

專案用到的是maven的來管理jar包的,所以需要如下的配置,需要增加兩個jar包的依賴
一個使用的spring-context的jar,一個是groovy需要的jar,由於spring5不在支援jdk1.8一下的版本,spring5中用到了jdk8的新語法lamba表示式,所以不在對低於jdk1.8版本的相容

 <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.0.4.RELEASE</version>
      </dependency>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy-all</artifactId>
      <version>2.4.12</version>
    </dependency>

接下來演示ioc容器的載入和容器如何使用的
注意,該配置檔案我都在resources下的ContailerOverview目錄中,所以配置檔案載入會有這個字首,後期程式碼會公佈,具體的地址請看sprig框架系列第一遍

/**
 * @Project: spring
 * @description:讀取容器
 *
 * 一般的載入方式:
 * 方式1: 可以用ClassPathXmlApplicationContext載入classPath路徑完成容器載入
 * 方式2: 可以用FileSystemXmlApplicationContext 系統路徑載入容器
 * 方式3:可以用GenericApplicationContext和XmlBeanDefinitionReader結合使用來載入
 *
 * 另外也可以載入組合檔案
 * 讀取groovy的配置檔案需要groovy-all.jar的支援
 * 載入groovy 可以用使用
 * 1.使用GenericGroovyApplicationContext的容器里載入
 * 2.使用GenericApplicationContext和GroovyBeanDefinitionReader結合使用
 *
 * @author: sunkang
 * @create: 2018-09-11 11:00
 * @ModificationHistory who      when       What
 **/
public class ApplicationBootstrap {

    public static void main(String[] args) {
        /*-----------------------------------載入spring的xml配置檔案-----------------------------*/
        //1.一次性讀取多個檔案
        ApplicationContext context = new ClassPathXmlApplicationContext("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
        PersonService  personService=  context.getBean("personService",PersonService.class);
        Person person =  personService.findPersonByUsername("sunkang");
        System.out.println(person);

        //2.讀取組合檔案
//       //用 ClassPathXmlApplicationContext來讀取
//       ApplicationContext context1 = new ClassPathXmlApplicationContext("spring-compose.xml");
        String filePath=ApplicationBootstrap.class.getClassLoader().getResource("").getPath()+ "ContailerOverview/spring-compose.xml";
        System.out.println(filePath);
        //用FileSystemXmlApplicationContext來讀取
        ApplicationContext   context1=  new FileSystemXmlApplicationContext(filePath);
        PersonService  personService1= context1.getBean("personService",PersonService.class);
        System.out.println(personService1.findPersonByUsername("wangzezhi"));

        //3.靈活的變體GenericApplicationContext和XmlBeanDefinitionReader結合使用
        GenericApplicationContext context2 = new GenericApplicationContext();
        new XmlBeanDefinitionReader(context2).loadBeanDefinitions("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
        context2.refresh();

       /*-----------------------------------載入groovy的檔案-----------------------------*/
        //4.使用groovy  檔案配置
        ApplicationContext context3 = new GenericGroovyApplicationContext("ContailerOverview/groovy-dao.groovy", "ContailerOverview/groovy-service.groovy");
        PersonService  personService3= context3.getBean("personService",PersonService.class);
        System.out.println(personService3.findPersonByUsername("sunkang"));

        //5.使用GenericApplicationContext和GroovyBeanDefinitionReader結合使用
        GenericApplicationContext context4 = new GenericApplicationContext();
        new GroovyBeanDefinitionReader(context4).loadBeanDefinitions("services.groovy", "daos.groovy");
        context4.refresh();
    }
}

相關文章