Spring DI依赖注入

本文深入解析依赖注入(DI)和构造注入(CI)的概念及应用,通过实例展示如何在Spring框架下实现属性和对象的注入,包括普通属性注入、对象属性注入及构造方法注入的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、两种注入方式介绍

  DI(Dependency Injection),依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。简单来说,所谓的依赖注入其实就是,在创建对象的同时或之后,如何给对象的属性赋值。如果对象由我们自己创建,这一切都变得很简单,例如:

User user = new User();
user.setName("zs");
user.setAge(18)

或者:

User user = new User("zs", 18);

如果对象由spring创建,那么spring是怎么给属性赋值的?spring提供两种方式为属性赋值:
(1).Set方式注入
(2).构造方法注入(spring大都使用这种方式)

二、set方式注入

1.普通属性注入

案例:通过Spring创建User实例,并为User实例的name和age属性(普通属性)赋值
1)创建User类,声明name和age属性,并添加对应的setter和getter方法,以及toString方法

package com.company.spring;

public class User {
	private String name;
	private Integer age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}

2)在applicationContext.xml中声明User类的bean实例

<!-- 声明User类的bean实例 -->
<bean id="user" class="com.tedu.spring.User"></bean>

3)创建测试类—TestDI

package com.company.spring;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
	public static void main(String[] args) {
		//1.加载applicationContext.xml核心配置文件
		ClassPathXmlApplicationContext ac = 
				new ClassPathXmlApplicationContext(
					"applicationContext.xml"
				);
		//2.获取User类的实例
		User user = (User) ac.getBean("user");
		
		//3.输出User实例
		System.out.println( user );
	}
}

4)修改applicationContext.xml中User实例的声明,为User实例注入属性

<!-- 声明User类的bean实例 -->
<bean id="user" class="com.company.spring.User">
	<!-- 通过set方式为普通属性赋值 -->
	<property name="name" value="zs"></property>
	<property name="age" value="20"></property>
</bean>

其中name属性的值,必须要和User类中所注入属性对应的get方法的名字去掉get后首字母变为小写的名字相同。
5)运行测试类TestDI

2.对象属性注入

1)创建UserInfo类

package com.company.spring;
public class UserInfo {
	
}

2)在applicationContext.xml中,声明UserInfo类的bean实例

<!-- 声明UserInfo类的bean实例 -->
<bean id="userInfo" class="com.company.spring.UserInfo"></bean>

3)修改User类,声明userInfo属性,添加对应的setter和getter方法,并重新生成toString方法

public class User {
	...
	private UserInfo userInfo;
	
	public UserInfo getUserInfo() {
		return userInfo;
	}
	public void setUserInfo(UserInfo userInfo) {
		this.userInfo = userInfo;
	}
	...
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", userInfo=" + userInfo + "]";
	}
}

4)在applicationContext.xml中,将UserInfo对象作为值,赋值给User对象的userInfo属性

<!-- 声明User类的bean实例 -->
<bean id="user" class="com.tedu.spring.User">
	<!-- 通过set方式为普通属性赋值 -->
	<property name="name" value="韩少云"></property>
	<property name="age" value="20"></property>
	<!-- 通过set方式为对象属性赋值 -->
	<property name="userInfo" ref="userInfo"></property>
</bean>

由于此处是将UserInfo对象作为值赋值给另一个对象的属性,因此ref属性的值,为UserInfo对象bean标签的id值。对象属性通过ref属性注入。
5)运行测试类TestDI

三、构造方法注入

案例:通过Spring创建User对象,并为User对象的属性(name、age、UserInfo属性)赋值

1)为User类声明构造函数

//声明无参构造函数
public User() {
}
//声明有参构造函数
public User(String name, Integer age, UserInfo userInfo) {
	super();
	this.name = name;
	this.age = age;
	this.userInfo = userInfo;
}

2)修改applicationContext.xml文件,将set方式修改为构造方法注入。

<bean id="user" class="com.company.spring.User">
	<!-- 通过set方式为普通属性赋值
	<property name="name" value="zs"></property>
	<property name="age" value="20"></property>
	<property name="userInfo" ref="userInfo"></property>
	 -->
	<!-- 通过构造器中参数为属性赋值 -->
	<constructor-arg name="name" value="马云"></constructor-arg>
	<constructor-arg name="age" value="35"></constructor-arg>
	<constructor-arg name="userInfo" ref="userInfo"></constructor-arg>
</bean>

<!-- 声明UserInfo类的bean实例 -->
<bean id="userInfo" class="com.company.spring.UserInfo"></bean>

其中,constructor-arg标签name属性的值必须和构造函数中参数的名字相同.同样的,普通属性直接通过value注入即可;对象属性通过ref属性注入。
3)运行测试类TestDI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值