Spring IoC 容器 Bean 的裝配
阿新 • • 發佈:2020-09-10
注:以下檔案均使用同一個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、構造器注入在類中需要建立相應的構造器,