spring中的依赖注入:dependency injection 简称DI
IOC的作用:降低程序间的依赖
依赖关系的管理:交给spring来维护
在当前类需要用到其他类的对象,由spring来为我们提供,我们只需在配置文件中说明依赖关系维护,称为依赖注入
能注入的类型有三类:
1.基本类型和String类
2.其他bean类型(在配置文件中或者注解配置过的bean)
3.复杂类型/集合类型
注入的方式有三种
1.构造函数提供
2.set方法提供
3.注解提供(第二天内容)
一、构造函数注入
1、新建工程,新建接口和类,并创建bean.xml以及测试用的模拟客户端Client
2、IAccountService接口类写上模拟保存账户的方法
3、接口的实现类:
这里写了三个类型:String,Integer,以及Date类型,并生成对应的含参的初始化构造函数,调用saveAccount方法来打印初始化后的信息
ps:这里只是演示注入这几个类型的方法,事实上,如果是经常需要变动的数据,我们不要使用注入,比如注册用户的一些信息,是经常需要重新赋值的,这种不要使用注入,再比如像用户的姓名,用户名,密码啊什么的,不经常变动的,我们可以使用注入。故,这里只是一个演示注入这几个类型的方法
4、bean.xml文件:
用构造器方式注入,标签为<constructor-arg>
,name
为对应的实体类中的字段名称,value
为值
可以看到age是Integer类型的,而value为一个字符串类型,则不用担心,因为spring会为我们自动检测和转换类型
但是由于birthday
为Date
类型,则不能用字符串强转成Date类型,所以这里使用了ref
引用已经配置好的类型为Date的bean(这里的Date在实际中,可以使用任意我们自己写的实体类,Date包装类只是一个代表)
5、运行Client.main()
运行结果:
优势:
必须提供对应的参数个数,否则无法完成实例化,减少错误。
弊端:
如果有几个参数是可能用不到的,可以不提供的,则无法完成实例化,比较笨拙
二、set方法注入(常用)
1、将(构造方法注入的)含参构造函数删掉,生成set方法
注意这里,我把set方法的方法名改了,并不和字段名称对应
2、编写bean.xml
property
的name
对应的是实体类中的set方法后面的字符串!
并且忽略首字母的大小写(setusername的u为小写,name对应的Username的U为大写 setAge的A为大写,name对应的age的a为小写)
优势:
创建对象时没有明显的限制,可以直接使用默认构造函数
弊端:
可以选择不传入某几个参数,比较灵活,但是不能保证必须的参数传入(可能漏传必要参数)
三、集合类型注入
1、方便起见,直接在AccountServiceImpl类中修改
写一些集合对象,生成set方法
package com.itheima.service.impl;
import com.itheima.service.IAccountService;
import java.util.*;
public class AccountServiceImpl implements IAccountService {
private String[] myStrs;
private List<String> myList;
private Map<String,String> myMap;
private Set<String> mySet;
private Properties myPros;
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyPros(Properties myPros) {
this.myPros = myPros;
}
public void saveAccount() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(myMap);
System.out.println(mySet);
System.out.println(myPros);
}
}
2、bean中的编写(重要)
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="myStrs">
<array >
<value>SAAA</value>
<value>SBBB</value>
<value>SCCC</value>
</array>
</property>
<property name="myList">
<list >
<value>LAAA</value>
<value>LBBB</value>
<value>LCCC</value>
</list>
</property>
<property name="mySet">
<set >
<value>SAAA</value>
<value>SBBB</value>
<value>SCCC</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="M1" value="m1"></entry>
<entry key="M2" value="m2"></entry>
<entry key="M3" value="m3"></entry>
</map>
</property>
<property name="myPros">
<props>
<prop key="p1">prop1</prop>
<prop key="p2">prop2</prop>
<prop key="p3">prop3</prop>
</props>
</property>
</bean>