依赖注入的概念
依赖注入:Dependency Injection。它是Spring框架核心Ioc的具体实现。
我们的程序在编写时,通过控制反转,把对象的创建交给了Spring,但是代码当中不可能没有出现依赖的情况。Ioc解耦只是降低它们的依赖关系,但不会清除。
例如,业务层仍然会调用持久层的方法,这种依赖关系,在使用Spring之后,就需要让Spring来进行维护。
简单地说,就是等框架把持久层的对象传入到业务层,而不用自己去获取。
构造函数的注入
使用类中的构造函数,给变量赋值,需要注意,赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入。
public class AccountServiceImpl implements IAccountService { private String name; private Integer age; private Date birthday; public AccountServiceImpl(String name, Integer age, Date birthday) { this.name = name; this.age = age; this.birthday = birthday; } @Override public void saveAccount() { System.out.println(name+","+age+","+birthday); } }
使用constructor-arg标签,采用使用构造函数的方式,给service中的属性传值。类中需要提供一个对应参数列表的构造函数。
constructor-arg
index:指定参数在构造函数参数列表中的索引位置
type:指定参数在构造函数中的数据类型。
name:指定参数在构造函数中的名称。
value:它能赋值基本数据类型和String类型
reg:它能赋值其他Bean类型,必须是在配置文件中配置过的Bean。
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"> <constructor-arg name="name" value="张三"></constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <constructor-arg name="birthday" ref="now"></constructor-arg> </bean> <bean id="now" class="java.util.Date"></bean>
set方法注入
在类中提供需要注入成员的set方法。
public class AccountServiceImpl implements IAccountService { private String name; private Integer age; private Date birthday; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public void saveAccount() { System.out.println(name+","+age+","+birthday); } }
使用property标签,通过配置文件给bean中的属性传值。
property
name:找到类中set方法后面的部分
ref:给属性赋值是其他bean类型
value:给属性复制是基本数据类型和String类型。
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"> <property name="name" value="test"></property> <property name="age" value="21"></property> <property name="birthday" ref="now"></property> </bean> <bean id="now" class="java.util.Date"></bean>
使用p名称空间注入数据
通过在xml空间中导入p名称空间,使用p:propertyName来注入数据,它的本质还是调用类中的set方法实现注入功能。
public class AccountServiceImpl implements IAccountService { private String name; private Integer age; private Date birthday; public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public void saveAccount() { System.out.println(name+","+age+","+birthday); } }
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl4" p:name="test" p:age="21" p:birthday-ref="now"/> </beans>
注入集合属性
给类中的集合成员传值,使用的也是set方法注入,不过变量的数据类型都是集合。
public class AccountServiceImpl implements IAccountService { private String[] myStrs; private List<String> myList; private Set<String> mySet; private Map<String,String> myMap; private Properties myProps; public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public void setMyList(List<String> myList) { this.myList = myList; } public void setMySet(Set<String> mySet) { this.mySet = mySet; } public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } public void setMyProps(Properties myProps) { this.myProps = myProps; } @Override public void saveAccount() { System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); System.out.println(myProps); } }
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"> <!-- 在注入集合数据时,只要结构相同,标签可以互换 --> <!-- 给数组注入数据 --> <property name="myStrs"> <set> <value>AAA</value> <value>BBB</value> <value>CCC</value> </set> </property> <!-- 注入 list 集合数据 --> <property name="myList"> <array> <value>AAA</value> <value>BBB</value> <value>CCC</value> </array> </property> <!-- 注入 set 集合数据 --> <property name="mySet"> <list> <value>AAA</value> <value>BBB</value> <value>CCC</value> </list> </property> <!-- 注入 Map 数据 --> <property name="myMap"> <props> <prop key="testA">aaa</prop> <prop key="testB">bbb</prop> </props> </property> <!-- 注入 properties 数据 --> <property name="myProps"> <map> <entry key="testA" value="aaa"></entry> <entry key="testB"> <value>bbb</value> </entry> </map> </property> </bean>