Spring DI 依赖注入案例(带参数构造方法依赖注入和setter方法依赖注入和p名称空间注入)
DI 依赖注入:
简单的说是指对象中的属性的值设置方式不再是调用setter方法进行传值,而是由配置实现经过框架传值。
DI操作可以采用两种实现方案:
1、使用带参构造实现注入
<!-- 采用带参构造的方式实现依赖注入 -->
<bean id="user" class="cn.sz.pojo.User">
<constructor-arg name="id" value="123"></constructor-arg>
</bean>
2、使用setter方法实现注入
<!-- 采用setter方法实现依赖注入 -->
<bean id="user" class="cn.sz.pojo.User">
<property name="id" value="13"></property>
</bean>
补充:constructor和property标签中常用属性:name,value,ref
name 设置类中的属性名
value设置属性的具体值
ref设置bean的id(及关联其它的配置项的id)
下面演示的是带参数构造方法依赖注入和setter方法依赖注入方式:
项目中SpringTest.java测试类使用junit方式测试即单元测试。lib目录下为测试中需要的spring jar包,log4j.jar为日志包,User.java是测试需要的一个实体类,applicationContext.xml为spring的主配置文件,名称可以任意但官方建议使用该默认名称。log4j.properties为日志配置文件。本案例使用的spring版本为 spring4.3.9。
创建一个java项目,项目结构如下:
代码如下:
1、applicationContext.xml (主配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--DI操作(依赖注入) -->
<!-- 方式一采用带参构造的方式实现依赖注入 -->
<bean id="user4" class="cn.sz.pojo.User">
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
<!-- 方式二:采用setter方法实现依赖注入 ,还演示了结合属性的依赖注入 -->
<bean id="user5" class="cn.sz.pojo.User">
<property name="id" value="456"></property>
<property name="name" value="李四"></property>
<!-- 数组属性依赖注入 -->
<property name="strs">
<array>
<value>数组属性1</value>
<value>数组属性2</value>
<value>数组属性3</value>
</array>
</property>
<!-- list集合属性依赖注入 -->
<property name="list">
<list>
<value>list属性1</value>
<value>list属性2</value>
<value>list属性3</value>
</list>
</property>
<!-- set集合属性依赖注入(set集合内容不能重复) -->
<property name="set">
<set>
<value>set属性1</value>
<value>set属性2</value>
<value>set属性3</value>
</set>
</property>
<!-- map集合属性依赖注入 -->
<property name="map">
<map>
<entry key="key1" value="map集合属性1"></entry>
<entry key="key2" value="map集合属性2"></entry>
<entry key="key3" value="map集合属性3"></entry>
</map>
</property>
<!--Properties属性依赖注入 -->
<property name="properties">
<props>
<prop key="p1">Properties属性1</prop>
<prop key="p2">Properties属性2</prop>
</props>
</property>
</bean>
</beans>
2、log4j.properties (日志文件)
3、SpringTest.java (junit测试类)
package cn.sz.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sz.pojo.User;
public class SpringTest {
// 方法一:使用带参构造方法实现依赖注入
@Test
public void testA() {
// 读取主配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user4 = ac.getBean("user4", User.class);
System.out.println(user4.toString());
}
// 方法二: 使用setter方法实现依赖注入
@Test
public void testB() {
// 读取主配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user5 = ac.getBean("user5", User.class);
System.out.println(user5.toString());
}
}
4、User.java (用户实体类)
package cn.sz.pojo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class User {
private Integer id;
private String name;
private String[] strs;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties properties;
// 保留无参的构造方法
public User() {
}
// 为了演示使用带参数构造的方式实现依赖注入所以提供一个带参的构造方法测试
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
// 下面的setter方法是测试使用setter方式依赖注入使用的
public String[] getStrs() {
return strs;
}
public void setStrs(String[] strs) {
this.strs = strs;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", strs=" + Arrays.toString(strs) + ", list=" + list + ", set="
+ set + ", map=" + map + ", properties=" + properties + "]";
}
}
testA()测试结果:
testB()测试结果:
以上两种方式以及完成了依赖注入
接下来是名称空间注入:
只是在配置文件有所不同,其他用法和以上的方法一致:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:user="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 命名空间创建对象 -->
<bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>
</beans>
注:需要使用setter/getter方法
xmlns:user="http://www.springframework.org/schema/p"
user为任意的名称
<bean id="user" class="cn.sz.pojo.User" user:uid="101" user:name="李四"></bean>
bean中user是上面配置的user,名称一致