DI 依赖注入的xml配置
依赖注入分类
(1)按照注入的方式分类
① set方法注注入:它是通过类成员的set⽅法实现数据的注入(使⽤最多的)。
name:指定注入时调⽤的set⽅法名称。(注:不包含set这三个字⺟,druid连接池指定属性名称)
value:指定注入的数据。它⽀持基本类型和String类型。
ref:指定注⼊的数据。它⽀持其他bean类型。写的是其他bean的唯⼀标识。
注意:该类必须有无参构造方法,避免写了有参构造后不会自动生成无参构造的情况,如果没有无参构造,在IDEA中class属性中的全类名下会有红色波浪线。
public class UserServiceImpl implements UserService {
private UserDao userDao;
private int num;
private String s;
public UserServiceImpl() {
}
public void setNum(int num) {
this.num = num;
}
public void setS(String s) {
this.s = s;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
System.out.println("userService impl running");
}
}
<bean id="userDao" class="com.nanmao.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
<property name="num" value="666"/>
<property name="s" value="version"/>
</bean>
② 构造函数注入:顾名思义,就是利⽤带参构造函数实现对类成员的数据赋值。
在使⽤构造函数注⼊时,涉及的标签是 constructor-arg ,该标签有如下属性:
name:用于给构造函数中指定名称的参数赋值。
index:用于给构造函数中指定索引位置的参数赋值。
value:用于指定基本类型或者String类型的数据。
ref:用于指定其他Bean类型的数据。写的是其他bean的唯⼀标识。
注意:类中提供的构造函数参数个数必须和配置的参数个数⼀致,且数据类型匹配。同时需要注意的是,当没有⽆参构造时,则必须提供构造函数参数的注⼊,否则Spring框架会报错。
public class UserServiceImpl implements UserService {
private UserDao userDao;
private int num;
private String s;
public UserServiceImpl() {
}
private UserServiceImpl(UserDao userDao , int num , String s){
this.userDao = userDao;
this.num = num;
this.s = s;
}
@Override
public void save() {
System.out.println("userService impl running");
}
}
<bean id="userDao" class="com.nanmao.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
<!--构造方法注入-->
<!--index属性从0开始,可以标记参数的顺序-->
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="num" value="3333"/>
<constructor-arg name="s" value="string"/>
</bean>
(2)按照注入的数据类型分类
① 基本类型和String
注入的数据类型是基本类型或者是字符串类型的数据。
② 其他Bean类型
注⼊的数据类型是对象类型,称为其他Bean的原因是,这个对象是要求出现在IoC容器中的。那么针对当前Bean来说,就是其他Bean了。
③ 复杂类型(集合类型)
注⼊的数据类型是Aarry,List,Set,Map,Properties中的⼀种类型。
下面对于复杂类型,使用set方式注入进行演示。
public class BookDaoImpl implements BookDao {
private int[] arr;
private ArrayList<String> list;
private Properties properties;
private HashSet<String> hs;
private HashMap<String,String> hm;
public void setArr(int[] arr) {
this.arr = arr;
}
public void setList(ArrayList<String> list) {
this.list = list;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setHs(HashSet<String> hs) {
this.hs = hs;
}
public void setHm(HashMap<String, String> hm) {
this.hm = hm;
}
@Override
public void save() {
System.out.println("BookDao running.....");
System.out.println("ArrayList:" + list);
for (int i : arr) {
System.out.println("arr: " + i);
}
System.out.println("HashMap: " + hm);
System.out.println("HashSet: " + hs);
}
}
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="arr">
<array>
<value>111</value>
<value>222</value>
</array>
</property>
<property name="list">
<list>
<value>hello</value>
<value>word</value>
</list>
</property>
<property name="hs">
<set>
<value>hello</value>
<value>word</value>
</set>
</property>
<property name="properties">
<props>
<prop key="userName">zhangsan</prop>
<prop key="password">123456</prop>
</props>
</property>
<property name="hm">
<map>
<entry key="StudentName1" value="李四"/>
<entry key="StudentName2" value="王五"/>
</map>
</property>
</bean>
控制台输出:
BookDao running.....
ArrayList:[hello, word]
arr: 111
arr: 222
HashMap: {StudentName1=李四, StudentName2=王五}
HashSet: [hello, word]
SpringEL表达式:
在依赖注入的时候,我们对于其他bean的引入也可以使用value属性,不过属性值要使用SpringEL表达式来表示,即加 “#{ }”。
<bean id="userService" class="com.nanmao.service.impl.UserServiceImpl">
<!-- <property name="userDao" ref="userDao"/>-->
<!-- <property name="bookDao" ref="bookDao"/>-->
<!--spEL表达式-->
<property name="userDao" value="#{userDao}"/>
<property name="bookDao" value="#{bookDao}"/>
</bean>