1. 程式人生 > 實用技巧 >Spring IoC 容器 Bean 的裝配

Spring IoC 容器 Bean 的裝配

注:以下檔案均使用同一個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>org.example</groupId>
    <artifactId>homework0909</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
    </dependencies>

</project>

一、spring 專案的建立練習

1.1 先建立一個HardDisk 介面:

package spring.computer.dao;

public interface HardDisk {
    void diskInfo();
}

1.2 實現這個介面

實現一:三星硬碟:

package spring.computer.dao;

public class SamsungHardDisk implements HardDisk {

    private int memorySize;

    // 實現diskInfo方法,輸出硬碟資訊
    @Override
    public void diskInfo() {
        System.out.println("這是三星硬碟,記憶體大小是:" + memorySize);
    }

    public void setMemorySize(int memorySize) {
        this.memorySize = memorySize;
    }
}

實現二:希捷硬碟:

package spring.computer.dao;

public class SeagateHardDisk implements HardDisk {

    private int memorySize;

    // 實現diskInfo方法,輸出硬碟資訊
    @Override
    public void diskInfo() {
        System.out.println("這是希捷硬碟,記憶體大小是:" + memorySize);
    }

    public void setMemorySize(int memorySize) {
        this.memorySize = memorySize;
    }
}

1.3 編寫xml配置檔案

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <bean id="seagate256g" class="spring.computer.dao.SeagateHardDisk">
        <property name="memorySize" value="256"/>
    </bean>
    <bean id="samsung1tb" class="spring.computer.dao.SamsungHardDisk">
        <property name="memorySize" value="1000"/>
    </bean>
</beans>

1.4 測試類

package spring.computer.dao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HardDiskImplTest {
    public static void main(String[] args) {
        // 例項化spring容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

        // 獲取希捷硬碟bean
        SeagateHardDisk seagate256g = (SeagateHardDisk)ctx.getBean("seagate256g");
        seagate256g.diskInfo();

        // 獲取三星硬碟bean
        SamsungHardDisk samsung1tb = (SamsungHardDisk)ctx.getBean("samsung1tb");
        samsung1tb.diskInfo();
    }

}

1.5 執行結果

二、印表機輸出配置資訊練習

2.1、編寫InkDao/PaperDao介面

InkDao.java

package com.printer.ink;

public interface InkDao {
    // 定義printInkInfo方法,輸出Ink資訊
    void printInkInfo();
}

PaperDao.java

package com.printer.paper;

public interface PaperDao {
    // 定義printPaperInfo方法,輸出紙張資訊
    void printPaperInfo();
}

2.2 編寫InkDaoImpl/PaperDaoImpl

InkDaoImpl.java

package com.printer.ink;

public class InkDaoImpl implements InkDao {

    private String inkInfo;

    // 提供構造器供框架呼叫
    InkDaoImpl(){}
    InkDaoImpl(String inkInfo) {
        this.inkInfo = inkInfo;
    }

    @Override
    public void printInkInfo() {
        System.out.println("墨盒資訊:" + inkInfo);
    }

    /*
    public void setInkInfo(String inkInfo) {
        this.inkInfo = inkInfo;
    }
     */
}

PaperDaoImpl.java

package com.printer.paper;

public class PaperDaoImpl implements PaperDao {

    private String paperInfo;

    // 提供構造器供框架呼叫
    PaperDaoImpl(){}
    PaperDaoImpl(String paperInfo) {
        this.paperInfo = paperInfo;
    }

    @Override
    public void printPaperInfo() {
        System.out.println("紙張資訊:" + paperInfo);
    }

    /*
    public void setPaperInfo(String paperInfo) {
        this.paperInfo = paperInfo;
    }
     */
}

2.3 編寫Printer類

Printer.java

package com.printer.printer;

import com.printer.ink.InkDao;
import com.printer.paper.PaperDao;

public class Printer {

    private InkDao inkDao;
    private PaperDao paperDao;

    public void printerInfo() {
        System.out.println("印表機配置");
        inkDao.printInkInfo();
        paperDao.printPaperInfo();
    }

    public void setInkDao(InkDao inkDao) {
        this.inkDao = inkDao;
    }

    public void setPaperDao(PaperDao paperDao) {
        this.paperDao = paperDao;
    }
}

2.4 編寫xml配置檔案

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd">
    <bean id="inkInfo" name="inkDao" class="com.printer.ink.InkDaoImpl">
        <constructor-arg name="inkInfo" value="墨水還有20桶" index="0"/>
        <!--
        <property name="inkInfo" value="墨水還有20桶。"/>
        -->
    </bean>
    <bean id="paperInfo" name="paperDao" class="com.printer.paper.PaperDaoImpl">
        <constructor-arg name="paperInfo" value="紙張還有800捆。" index="0"/>
        <!--
        <property name="paperInfo" value="紙張還有800捆。"/>
        -->
    </bean>
    <bean id="mainPrinter" class="com.printer.printer.Printer">
        <property name="inkDao" ref="inkInfo"/>
        <property name="paperDao" ref="paperInfo"/>
    </bean>

</beans>

2.5 編寫PrinterTest測試類

package com.printer.printer;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PrinterTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        Printer mainprinter = (Printer)ctx.getBean("mainPrinter");
        mainprinter.printerInfo();
    }
}

## 2.6 執行結果
![](https://img2020.cnblogs.com/blog/1604857/202009/1604857-20200910153244099-1104604893.png)

備註:
1、設值注入和自動注入均需要setter方法。
2、構造器注入不能有setter方法(不確定)。
3、設值注入在類中建立stter方法,在xml配置檔案中建立bean元素,不同的bean用id來區分,id是自定義的可以隨便寫。
bean裡面有property屬性是setter方法需要設定的屬性,name是class的成員變數,value是指定的值,如果是引用的bean,則需要指定 ref而不是value
4、構造器注入在類中需要建立相應的構造器,