暑期自學 Day 16 | Spring (二)

Borris發表於2020-06-20

控制反轉 (IoC)

如果直接使用 new 來建立物件,那麼應用和資源是直接建立聯絡的。如果使用工廠模式,工廠會提供相應的物件資源給應用,降低了程式間的耦合。

  • 只能降低耦合,並不能完全消除。
  • 把建立物件的權利交給了框架。*

使用 spring 實現控制反轉

  • 建立一個maven專案,並新增依賴

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>spring.selflearning</groupId>
    <artifactId>day01_eesy_03spring</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
        </dependency>
    </dependencies>


</project>
  • 建立配置檔案
    在這個配置檔案裡寫入可重用元件的id

resources/bean.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">
<!--  物件建立交給spring  -->
    <bean id="accountService" class="spring.selflearning.service.impl.AccountServiceImpl"></bean>
    <bean id="accountDao" class="spring.selflearning.dao.impl.AccountDaoImpl"></bean>
</beans>
  • 表現層利用spring建立IoC容器,獲取所需物件
package spring.selflearning.ui;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.selflearning.dao.IAccountDao;
import spring.selflearning.service.IAccountService;
import spring.selflearning.service.impl.AccountServiceImpl;

/*
模擬表現層,用於呼叫業務層
 */

/*
獲取Spring 的 IoC 核心容器,並根據id獲取物件
 */
public class Client {
    public static void main(String[] args) {

        // 獲取核心容器物件
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

        // 根據id獲取bean物件
        IAccountService as = (IAccountService) ac.getBean("accountService");
        IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
        System.out.println(as);
        System.out.println(adao);
        as.saveAccount();
    }
}

ApplicationContext

三個常用實現類

  • ClassPathXmlApplicationContext

    • 載入類路徑下的配置檔案
    • 實際開發中推薦使用這個
  • FileSystemXmlApplicationContext

    • 載入磁碟任意路徑下的配置檔案
  • AnnotationConfigApplicationContext

    • 用於讀取註解建立容器

ApplicationContext 與 BeanFactory 的區別

  • ApplicationContext 建立核心容器時,在讀取完配置檔案內容後立即建立配置檔案中的配置物件
    • 建立單例物件時適用
  • BeanFactory 建立核心容器時,延遲載入建立物件,即使用getBean()根據id獲取物件時才建立物件
    • 建立多例物件時適用

建立bean物件的三種方式

bean.xml檔案中,我們使用<bean></bean>標籤來配置物件的id和class屬性。
這是第一種方式:

<bean id="accountService" class="spring.selflearning.service.impl.AccountServiceImpl"></bean>

直接使用這種方法配置要建立物件的屬性,物件所屬類中必須有預設的建構函式,否則無法正常建立物件。

有時在java內建的jar包裡,或者在他人建立的類中,沒有預設建構函式。這種情況下我們需要使用第二種方式,即先獲取該類,再透過factory-beanfactory-method屬性來建立所需的物件。

<!-- 這是一個模擬工廠類,可能存在於jar包中,也可能在他人建立的類中-->
<bean id="instanceFactory" class="spring.selflearning.factory.InstanceFactory"></bean>
<!-- 獲取相應的工廠和工廠內要建立物件對應的方法-->
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三中方式用於建立靜態工廠類靜態方法的物件:
class中獲取靜態類,factory-method中定義靜態方法。

    <bean id="accountService" class = "spring.selflearning.factory.StaticFactory" factory-method="getAccountService"></bean>
</beans>
Bean 的其他屬性
  • scope: 作用範圍
    • 取值:singleton, prototype, request, session, global-session
  • bean 物件生命週期
    • singleton: 和容器相同
    • prototype: 物件建立是開始,物件長時間不用時,由Java垃圾回收器回收。
  • inti-method:物件初始化
  • destory-method:物件銷燬
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章