Spring简单入门(二)——依赖注入DI

什么是依赖注入?通俗来说,就是创建一个对象时,把其成员变量也都给赋值。而注入方式主要有3种:①原理是通过类的构造函数来创建的(基于XML)。②原理是通过类的set方法来构造的(基于XML)。③就是通过注解的方式来获得。当然根据注入数据的不同,每种方式又有不同的方法:①基本数据和String类型、②IoC中注册的Bean类型、③Array、List、Set、Map、Properties等复杂类型

注:依赖注入是在IoC的基础上进行的,即无论采用何种方式进行注入,首先得把IoC相关的东西写好。(详情可见https://blog.csdn.net/m1179457922/article/details/107511502

(1)通过类的构造函数

首先,既然是通过类的构造函数,那么类必须要有一个对应的构造函数

public class Student {
	String name;
	public Student() {
		System.out.println("Student 无参构造器");
	}
	//关键
	public Student(String name) {
		this.name = name;
		System.out.println("Student 有参构造");
	}
	@Override
	public String toString() {
		return "Student [name=" + name + "]";
	}
}

通过构造函数是在配置文件中的<bean>标签下使用子标签<constructor-arg>,属性值name是成员变量的名称(成员变量和name值的首字母最好都小写,符合命名规范),不同的数据类型使用不同的属性值来进行注入:

基本数据类型和String类型,使用value属性来指定

<bean id="Student" class="Test.Student">
	<constructor-arg name="name" value="MMM"></constructor-arg>
</bean>

IoC中存在的Bean,使用ref属性来指定

<bean id="Cat" class="Test.Cat"></bean>
<bean id="Student" class="Test.Student">
	<constructor-arg name="name" value="MMM"></constructor-arg>
	<constructor-arg name="cat" ref="Cat"></constructor-arg>
</bean>

复杂类型的数据,在<constructor-arg>标签下面还有对应类型的子标签。Array、List、Set都是使用该类型的子标签<value>的标签体来加入基本数据类型及其包装类或者String,或者<ref bean="id">来指定Bean(Array、List、Set可以混用)

<bean id="Student" class="Test.Student">
	<constructor-arg name="name" value="MMM"></constructor-arg>
	<constructor-arg name="cats">
		<list>
			<ref bean="Cat1"/>
			<ref bean="Cat2"/>
			<ref bean="Cat3"/>
		</list>
	</constructor-arg>
</bean>

对于Map和Properties也可以混用,因此记住Map即可。

<bean id="Student" class="Test.Student">
	<constructor-arg name="name" value="MMM"></constructor-arg>
	<constructor-arg name="cats">
		<map>
			<entry key-ref="" value-ref=""></entry>
	    </map>
	</constructor-arg>
</bean>

如果是基本数据类型或者String,则将key-ref或value-ref改为key或者value

(2)通过set方法注入

通过构造方法注入,虽然可行,但是需要创建一个构造方法,而有时候构造方法不便对外可见。因此,就出现了另一种方法即通过set方法。因此类中必须有对应的set方法

(注:按照命名规范是没有问题的,但是实际上是调用了setXXX()方法,XXX是你指定的name的首字母大写)

通过set方法注入配置只是将<constructor-arg>换成了<property>

<bean id="Student" class="Test.Student">
	<property name="name" value="Moze"></property>
</bean>

(3)基于注解的方法注入

注解注入你也可以在xml中注册下Bean,然后再再类上使用注解注入(要打开注解扫描)

首先是介绍相关的注解。第一个是@Value("值"),使用在基本数据类型或者String类型上。

@Value("Moze")
String name;

注解不能够给复杂数据类型注入。因此现在只剩bean数据了,其较为复杂,共分为三个,@Autowired、@Qualifier、@Resource。这三个使用方法是一致的,但是原理有所不同

@Autowired
Cat cat;

@Autowired:自动按照类型注入。如果说IoC中只有一个该类型或者实现类的对象,那么匹配该对象。如果有多个,那就按照类的对象名去IoC容器中匹配对应的id,如果找到则注入,找不到则返回。

@Qualifier("id"):必须与Autowired连用,先按照类型匹配,有多个匹配的后,会使用id(而不是对象名)去匹配IoC容器

@Resource(name="id"):先按照id来匹配,如果匹配失败,再按照类型匹配。

因此@Resource和@Autowired使用较多,且@Resource较为方便

总结:至此能够完成对象的注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值