spring讲解4–依赖注入详解(DI)

本文深入讲解Spring框架中的依赖注入(DI)概念,包括属性注入、构造器注入和工厂方法注入等三种主要方式,并通过实例演示如何在XML配置文件中进行注入,涵盖了基本数据类型、复杂类型如Bean、List、Map及Set的注入方法。

spring讲解4–依赖注入详解(DI)

依赖注入的三种方式:
—属性注入(set方法)
—构造器注入
—工厂方法注入(很少使用,不推荐)
!!!!!
这里面特别提醒一下属性和成员变量的区别:
private String brand; //brand为成员变量
public String getBrand() { // set后面的单词小写,brand就表示属性.
return brand;
}

(1)通过set方法进行注入

applicationContext.xml

<bean id="car" class="com.atspring.beans.Car">
		<property name="brand" value="audi"></property>
		<property name="crop" value="yiqi"></property>
		<property name="price" value="22000"></property>
	</bean>

(2)使用构造器进行注入

<bean id="car1" class="com.atspring.beans.Car">
		<constructor-arg value="aodi"></constructor-arg>
		<constructor-arg value="huachen"></constructor-arg>
		<constructor-arg value="1000"></constructor-arg>
</bean>
其中car构造器使用时,不适用name指定构造器中的属性值。默认按照构造函数中的属性排列顺序进行赋值。可以使用
index关键词指定赋值的属性。
<bean id="car1" class="com.atspring.beans.Car">
		<constructor-arg value="aodi" index="0"></constructor-arg>
		<constructor-arg value="huachen" index="1"></constructor-arg>
		<constructor-arg value="1000" index="2"></constructor-arg>
</bean> 

当出现两个构造器的时候,此时有时候会出现异常,如下。

public Car(String brand, String crop, double price) {
	super();
	this.brand = brand;
	this.crop = crop;
	this.price = price;
}

public Car(String brand, String crop, int number) {
	super();
	this.brand = brand;
	this.crop = crop;
	this.number = number;
}

出现这种情况,在进行配置文件书写的时候,可以指定属性的类型,使用type关键字指定属性类型,这样子可以排除异常。

<bean id="car1" class="com.atspring.beans.Car">
		<constructor-arg value="aodi" index="0" type="String"></constructor-arg>
		<constructor-arg value="huachen" index="1"></constructor-arg>
		<constructor-arg value="1000" index="2"></constructor-arg>
	</bean>
	在加上使用其他的方式进行字符串的表达:
	<value><![CDATA[品牌《的说法是》]]></value>
	使用 <![CDATA[~~~~]]> 中间可以任何字符,都会被当做字符串进行处理。

(3)注入其他的bean (ref)

<bean id="person" class="com.atspring.beans.Person">
	<property name="name" value="limng"></property>
	<property name="age" value="10"></property>
	<!-- <property name="car" ref="car1"></property>  第一种方式,ref 后面是bean的id -->
	<property name="car">
		<bean class="com.atspring.beans.Car">   <!--  第二种方式进行bean的初始化,这种是内部bean的实现方式>
			<constructor-arg  index="0" type="String">
			<value><![CDATA[品牌《的说法是》]]></value>
			</constructor-arg>
			<constructor-arg value="huachen" index="1"></constructor-arg>
			<constructor-arg value="1000" index="2"></constructor-arg>
		</bean>
	</property>
</bean>

(4)注入其他的数据类型(List array set)

<bean id="personList" class="com.atspring.beans.PersonList">
		<property name="age" value="10"></property>
		<property name="name" value="liuwu"></property>
		<property name="cars">
			<list>           <!-- list代码块-->
				<ref bean="car"></ref>
				<ref bean="car1"></ref>
				<bean id=" " class="com.atspring.beans.Car">
					<constructor-arg  index="0" type="String">
						<value><![CDATA[品牌《的说法是》]]></value>
					</constructor-arg>
					<constructor-arg value="huachen" index="1"></constructor-arg>
					<constructor-arg value="1000" index="2"></constructor-arg>
				</bean>
			</list>
			<set></set>             <!-- set代码块-->
			<array></array>      <!-- array代码块-->
		</property>
	</bean>

(4)map类型注入 (对于map类的数据,使用entry进行表示)
在这里插入图片描述

上面实现中使用的类

创建person对象进行注入其他bean的验证
package com.atspring.beans;

public class Person {
	private String name;
	private int age;
	private Car car;

	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Person(String name, int age, Car car) {
		super();
		this.name = name;
		this.age = age;
		this.car = car;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
	}
}

创建Car类进行验证:

**car.java**

package com.atspring.beans;

public class Car {
	private String brand;
	private String crop;
	private double price;
	
	public Car() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Car(String brand, String crop, double price) {
		super();
		this.brand = brand;
		this.crop = crop;
		this.price = price;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getCrop() {
		return crop;
	}
	public void setCrop(String crop) {
		this.crop = crop;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", crop=" + crop + ", price=" + price
				+ "]";
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值