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 运行结果

备注:
1、设值注入和自动注入均需要setter方法。
2、构造器注入不能有setter方法(不确定)。
3、设值注入在类中创建stter方法,在xml配置文件中创建bean元素,不同的bean用id来区分,id是自定义的可以随便写。
bean里面有property属性是setter方法需要设置的属性,name是class的成员变量,value是指定的值,如果是引用的bean,则需要指定 ref而不是value
4、构造器注入在类中需要创建相应的构造器,xml配置文件中设置属性,同上,id用来定位,value用来指定值,ref指定引用。
5、自动注入同使用setter方法,只是需要指定bean实例的可以省略,ByType通过class定位,ByName通过name定位。
6、依赖从https://mvnrepository.com/网址查找拷贝到pom.xml文件。亦可手动下载jar包拷贝到项目并设置为依赖。

有了计划记得推动,不要原地踏步。
原文地址:https://www.cnblogs.com/amnotgcs/p/13646260.html