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配置文件中设置
5、自动注入同使用setter方法,只是需要指定bean实例的可以省略,ByType通过class定位,ByName通过name定位。
6、依赖从https://mvnrepository.com/网址查找拷贝到pom.xml文件。亦可手动下载jar包拷贝到项目并设置为依赖。
有了计划记得推动,不要原地踏步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)