5. SET方式注入
5.1 八种基本类型 + String类型注入使用+Date类型(含数组类型)
八种基本类型 + String类型注入使用+Date类型 使用value属性进行赋值
- 在组件中定义基本类型 + String类型 + Date类型的成员变量并提供公开的SET方法
public class ClazzServiceImpl implements ClazzService{
private ClazzDAO clazzDAO;
// SET注入语法,注入的是基本类型(含String和Date类型)
private String name;
private Integer age;
private boolean sex;
private double price;
private float counts;
private Date bir;
public void setBir(Date bir) {
this.bir = bir;
}
public void setPrice(double price) {
this.price = price;
}
public void setCounts(float counts) {
this.counts = counts;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setClazzDAO(ClazzDAO clazzDAO) {
this.clazzDAO = clazzDAO;
}
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
}
}
- 在配置文件中使用property标签的value属性完成基本类型 + String类型 + Date类型的赋值
<!--管理DAO组件-->
<bean class="setdi.ClazzDAOImpl" id="clazzDAO">
</bean>
<!--管理Service组件-->
<bean class="setdi.ClazzServiceImpl" id="clazzService">
<property name="clazzDAO" ref="clazzDAO"/>
<!--SET注入相关语法 总结:八种基本类型 + String类型注入使用+Date类型 使用value属性进行赋值 -->
<property name="name" value="张三"/>
<property name="age" value="23"/>
<property name="sex" value="true"/>
<property name="counts" value="23.23"/>
<property name="price" value="256.34"/>
<!--注意:在spring技术栈中日期格式默认为yyyy/MM/dd HH:mm:ss-->
<property name="bir" value="2012/12/12 23:54:57"/>
</bean>
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
注意:在spring技术栈中日期格式默认为yyyy/MM/dd HH:mm:ss
例如上面日期属性的赋值可以填2012/12/12,也可以填2012/12/12 23:54:57
注入八种基本类型+String+Date类型的数组使用property、array、value标签进行赋值
- 在组件中定义String数组类型的成员变量,并提供公开的SET方法
// 注入数组
private String[] qqs;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
}
- 在配置文件中使用property、array、value标签完成String数组的赋值
<!--注入数组类型 array-->
<property name="qqs">
<array>
<value>小陈</value>
<value>小三</value>
<value>小胡</value>
<value>小杨</value>
</array>
</property>
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
5.2 注入对象类型|引用类型(含数组)
注入对象类型|引用类型 统一使用ref属性进行注入
注入对象类型的数组使用property、array、ref标签进行赋值
- 在组件中定义类型为对象类型的数组的成员变量并提供公开的SET方法
// 注入引用类型数组
private ClazzDAO[] clazzDAOS;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
}
在配置文件中使用property、array、ref标签进行赋值
<property name="clazzDAOS">
<array>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
</array>
</property>
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
5.3 注入集合类型
5.3.1 注入List
List中是基本数据类型|String类型|日期类型
- 声明一个集合,集合中的泛型是String类型并提供公开的SET方法
private List<String> habbies;
public void setHabbies(List<String> habbies) {
this.habbies = habbies;
}
- 在配置文件中使用property、list、value标签进行赋值
<!--注入list集合-->
<property name="habbies">
<list>
<value>看书</value>
<value>睡觉</value>
<value>喝水</value>
</list>
</property>
List中是对象类型
- 声明一个集合,集合中的泛型是对象类型并提供公开的SET方法
private List<ClazzDAO> clazzDAOList;
public void setClazzDAOList(List<ClazzDAO> clazzDAOList) {
this.clazzDAOList = clazzDAOList;
}
- 在配置文件中使用property、list、ref标签进行赋值
<property name="clazzDAOList">
<list>
<!--ref标签中的bean属性中写的是前面spring中定义过的bean标签的唯一标识,即id-->
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
</list>
</property>
需要用到的ClazzServiceImpl类
// 需要用到的ClazzServiceImpl类
public class ClazzServiceImpl implements ClazzService{
private ClazzDAO clazzDAO;
// SET注入语法
private String name;
private Integer age;
private boolean sex;
private double price;
private float counts;
private Date bir;
// 注入数组
private String[] qqs;
private ClazzDAO[] clazzDAOS;
// 注入list集合
private List<String> habbies;
private List<ClazzDAO> clazzDAOList;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
}
}
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
5.3.2 注入map
map中key和value都为基本类型(或String类型或日期类型)
- 在组件中声明类型为Map类型且其中key和value都为基本类型的成员变量并提供公开的SET方法
// 注入map
private Map<String, String> maps;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
}
在配置文件中使用property、map、entry标签进行赋值
<!--注入map集合-->
<property name="maps">
<map>
<entry key="aa" value="xiaochen"/>
<entry key="bb" value="小陈"/>
<entry key="cc" value="xiaoming"/>
</map>
</property>
注意
对于entry标签而言,如果key是基本类型(或者String类型或者日期类型)使用entry标签的key属性对键赋值,如果key是对象类型,使用entry标签的key-ref属性对键赋值;同样,如果value是基本类型(或者String类型或者日期类型)使用entry标签的value属性对键赋值,如果value是对象类型,使用entry标签的value-ref属性对键赋值。(另外,键的类型和值的类型不一定都得是基本类型或者都是对象类型,根据需要自己创建,很灵活)。
测试
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
map中key和value都为对象类型
- 在组件中声明类型为Map类型且其中key和value都为对象类型的成员变量并提供公开的SET方法
private Map<ClazzDAO, ClazzDAO> map;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
map.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
}
- 在配置文件中使用property、map、entry标签进行赋值
<!--注入map集合-->
</property>
<property name="map">
<map>
<entry key-ref="clazzDAO" value-ref="clazzDAO"/>
</map>
</property>
注意
entry标签的key-ref属性和value-ref属性里面写的都是bean标签的唯一标识,即id
测试和结果
5.3.3 注入set
set中是基本类型(或String类型或日期类型)
- 在组件中声明类型为set且其中是String类型的成员变量并提供公开的SET方法
// 注入set
private Set<String> sets;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
map.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
System.out.println("=========遍历properties集合==============");
properties.forEach((key, value) -> {
System.out.println("key = " + key + " value = " + value);
});
System.out.println("=========遍历set集合==============");
sets.forEach(s -> System.out.println("s = " + s));
}
- 在配置文件中使用properties、set、value标签完成赋值
<!--注入set set中是String类型-->
<property name="sets">
<set>
<value>aaaa</value>
<value>bbbb</value>
</set>
</property>
测试和结果
set中是对象类型
- 在组件中声明类型为set且其中是对象类型的成员变量并提供公开的SET方法
private Set<ClazzDAO> daoSet;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
map.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
System.out.println("=========遍历properties集合==============");
properties.forEach((key, value) -> {
System.out.println("key = " + key + " value = " + value);
});
System.out.println("=========遍历set集合==============");
sets.forEach(s -> System.out.println("s = " + s));
System.out.println("=========遍历set集合:里面是对象类型==============");
daoSet.forEach(dao -> System.out.println("dao = " + dao));
}
- 在配置文件中使用properties、set、ref标签完成赋值
<!--注入set set中是对象类型-->
<property name="daoSet">
<set>
<!--注意:ref标签中的bean属性写前面的bean标签的唯一标识,即id-->
<ref bean="clazzDAO"/>
</set>
</property>
测试和结果
5.3.4 注入properties
properties本质是一个map,但是其注入方式与map有些不同,但遍历方式是一样的。
- 在组件中声明类型为properties的成员变量并提供公开的SET方法
// 注入Properties
private Properties properties;
// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
for (String qq : qqs) {
System.out.println(qq);
}
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
habbies.forEach(habby -> System.out.println("habby = " + habby));
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
map.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
System.out.println("=========遍历properties集合==============");
properties.forEach((key, value) -> {
System.out.println("key = " + key + " value = " + value);
});
}
- 在配置文件中使用properties、props、prop标签完成赋值
<!--注意:property标签是放在bean标签里面的-->
<!--注入properties-->
<property name="properties">
<props>
<prop key="111">aaa</prop>
<prop key="222">bbb</prop>
<prop key="333">ccc</prop>
</props>
</property>
测试和结果
5.4 总结
包含基本类型(含String和Date类型)、对象类型、数组类型、List、Map、Set、Properties类型的代码(代码中标有详细的注释,可以很方便的找到自己想要找的类型)
用到的组件类以及里面的详细代码
public class ClazzServiceImpl implements ClazzService{
// 对象类型
private ClazzDAO clazzDAO;
// 基本类型(含String和Date类型)
private String name;
private Integer age;
private boolean sex;
private double price;
private float counts;
private Date bir;
// 基本类型(含String和Date类型)数组
private String[] qqs;
// 对象类型数组
private ClazzDAO[] clazzDAOS;
// list集合,集合中是基本类型(含String和Date类型)
private List<String> habbies;
// list集合,集合中是对象类型
private List<ClazzDAO> clazzDAOList;
// map集合,其中key和value都是基本类型(含String和Date类型)
private Map<String, String> maps;
// map集合,其中key和value都是对象类型
private Map<ClazzDAO, ClazzDAO> map;
// Properties类型
private Properties properties;
// set集合,内部是基本类型(含String和Date类型)
private Set<String> sets;
// set集合,内部是对象类型
private Set<ClazzDAO> daoSet;
public void setDaoSet(Set<ClazzDAO> daoSet) {
this.daoSet = daoSet;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setMap(Map<ClazzDAO, ClazzDAO> map) {
this.map = map;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setClazzDAOList(List<ClazzDAO> clazzDAOList) {
this.clazzDAOList = clazzDAOList;
}
public void setHabbies(List<String> habbies) {
this.habbies = habbies;
}
public void setClazzDAOS(ClazzDAO[] clazzDAOS) {
this.clazzDAOS = clazzDAOS;
}
public void setQqs(String[] qqs) {
this.qqs = qqs;
}
public void setBir(Date bir) {
this.bir = bir;
}
public void setPrice(double price) {
this.price = price;
}
public void setCounts(float counts) {
this.counts = counts;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setClazzDAO(ClazzDAO clazzDAO) {
this.clazzDAO = clazzDAO;
}
@Override
public void save(String name) {
System.out.println("Service name = " + name);
clazzDAO.save(name);
// 基本类型(含String和Date类型)的遍历
System.out.println("Name = " + this.name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
System.out.println("price = " + price);
System.out.println("counts = " + counts);
System.out.println("bir = " + bir);
System.out.println("=========遍历数组==============");
// 基本类型(含String和Date类型)数组的遍历
for (String qq : qqs) {
System.out.println(qq);
}
// 对象类型数组的遍历
for (ClazzDAO dao : clazzDAOS) {
System.out.println(dao);
}
System.out.println("=========遍历集合==============");
// list类型的遍历,list中是基本类型(含String和Date类型)
habbies.forEach(habby -> System.out.println("habby = " + habby));
// list类型的遍历,list中是对象类型
clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
// map集合的遍历,map内部中key和value都是基本类型(含String和Date类型)
maps.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
// map集合的遍历,map内部中key和value都是对象类型(含String和Date类型)
map.forEach((key, value) -> {
System.out.println("key : " + key + " value : " + value);
});
// properties的遍历
System.out.println("=========遍历properties集合==============");
properties.forEach((key, value) -> {
System.out.println("key = " + key + " value = " + value);
});
System.out.println("=========遍历set集合==============");
// set类型的遍历,set中是基本类型(含String和Date类型)
sets.forEach(s -> System.out.println("s = " + s));
System.out.println("=========遍历set集合:里面是对象类型==============");
// set类型的遍历,set中是对象类型
daoSet.forEach(dao -> System.out.println("dao = " + dao));
}
}
用到的配置文件
<?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">
<!--管理DAO组件-->
<bean class="setdi.ClazzDAOImpl" id="clazzDAO">
</bean>
<!--管理Service组件-->
<bean class="setdi.ClazzServiceImpl" id="clazzService">
<!--对象类型-->
<property name="clazzDAO" ref="clazzDAO"/>
<!--基本类型(含String和Date类型)的数组 -->
<property name="name" value="张三"/>
<property name="age" value="23"/>
<property name="sex" value="true"/>
<property name="counts" value="23.23"/>
<property name="price" value="256.34"/>
<property name="bir" value="2012/12/12 23:54:57"/>
<!--基本类型(含String和Date类型)的数组-->
<property name="qqs">
<array>
<value>小陈</value>
<value>小三</value>
<value>小胡</value>
<value>小杨</value>
</array>
</property>
<!--对象类型的数组-->
<property name="clazzDAOS">
<array>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
</array>
</property>
<!--list集合,内部是基本类型(含String和Date类型)-->
<property name="habbies">
<list>
<value>看书</value>
<value>睡觉</value>
<value>喝水</value>
</list>
</property>
<!--list集合,内部是对象类型-->
<property name="clazzDAOList">
<list>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
<ref bean="clazzDAO"/>
</list>
</property>
<!--map集合,key和value都是基本类型(含String和Date类型)-->
<property name="maps">
<map>
<entry key="aa" value="xiaochen"/>
<entry key="bb" value="小陈"/>
<entry key="cc" value="xiaoming"/>
</map>
</property>
<!--map集合,key和value都是对象类型-->
<property name="map">
<map>
<entry key-ref="clazzDAO" value-ref="clazzDAO"/>
</map>
</property>
<!--properties-->
<property name="properties">
<props>
<prop key="111">aaa</prop>
<prop key="222">bbb</prop>
<prop key="333">ccc</prop>
</props>
</property>
<!--set set中是基本类型(含String和Date类型)-->
<property name="sets">
<set>
<value>aaaa</value>
<value>bbbb</value>
</set>
</property>
<!--set set中是对象类型-->
<property name="daoSet">
<set>
<ref bean="clazzDAO"/>
</set>
</property>
</bean>
</beans>
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
ClazzService clazzService = (ClazzService) context.getBean("clazzService");
clazzService.save("小陈");
}
}
结果
Service name = 小陈
DAO name = 小陈
Name = 张三
age = 23
sex = true
price = 256.34
counts = 23.23
bir = Wed Dec 12 23:54:57 CST 2012
=========遍历数组==============
小陈
小三
小胡
小杨
setdi.ClazzDAOImpl@3b0143d3
setdi.ClazzDAOImpl@3b0143d3
setdi.ClazzDAOImpl@3b0143d3
=========遍历集合==============
habby = 看书
habby = 睡觉
habby = 喝水
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
key : aa value : xiaochen
key : bb value : 小陈
key : cc value : xiaoming
key : setdi.ClazzDAOImpl@3b0143d3 value : setdi.ClazzDAOImpl@3b0143d3
=========遍历properties集合==============
key = 111 value = aaa
key = 222 value = bbb
key = 333 value = ccc
=========遍历set集合==============
s = aaaa
s = bbbb
=========遍历set集合:里面是对象类型==============
dao = setdi.ClazzDAOImpl@3b0143d3
6. 构造注入
# 1. 构造注入
使用类中构造方法为类中成员变量赋值过程称之为构造注入
# 2. 构造注入语法
1. 需要哪个类型就将谁声明为成员变量,并提供公开的构造方法
2. 在配置文件中对应的组件标签内使用<constructor-arg>标签进行注入
构造注入中很多用法其实与SET注入语法类似,只是将SET方法改为了构造方法,并且在配置文件中将property标签改成了constructor-arg标签,并且需要使用constructor-arg标签内部的index属性。
定义EmpDAO接口
定义实现类EmpDAOImpl
// 构造注入
public class EmpDAOImpl implements EmpDAO{
// 构造注入语法
private String name;
private Integer age;
private Date bir;
private String[] qqs;
private List<String> habbys;
public EmpDAOImpl(String name, Integer age, Date bir, String[] qqs, List<String> habbys) {
this.name = name;
this.age = age;
this.bir = bir;
this.qqs = qqs;
this.habbys = habbys;
}
public EmpDAOImpl() {
}
@Override
public void save(String name) {
System.out.println("name = " + name);
System.out.println("this.name = " + this.name);
System.out.println("this.age = " + this.age);
System.out.println("this.bir = " + this.bir);
System.out.println("========遍历数组==========");
for (String qq : qqs) {
System.out.println(qq);
}
System.out.println("========遍历list集合==========");
habbys.forEach(habby -> {
System.out.println("habby = " + habby);
});
}
}
配置文件
<!--管理DAO组件
1.SET方式注入 注入时使用property标签
2.构造方式注入 注入时使用constructor-arg标签
-->
<bean class="cdi.EmpDAOImpl" id="empDAO">
<!--使用构造注入-->
<constructor-arg index="0" name="name" value="小黑黑"/>
<constructor-arg index="1" name="age" value="23"/>
<constructor-arg index="2" name="bir" value="2012/12/12"/>
<!--注入数组-->
<constructor-arg index="3" name="qqs">
<array>
<value>小黑</value>
<value>小名</value>
<value>小陈</value>
</array>
</constructor-arg>
<!--注入list-->
<constructor-arg index="4" name="habbys">
<list>
<value>好人</value>
<value>坏蛋</value>
<value>小豆豆</value>
</list>
</constructor-arg>
</bean>
测试类
public class TestSpring {
public static void main(String[] args) {
// 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("cdi/spring.xml");
EmpDAO empDAO = (EmpDAO) context.getBean("empDAO");
empDAO.save("小明");
}
}
结果
补充
构造注入的缺点:
- 不够灵活,如果想要只对name属性赋值,那么必须提供一个只对name赋值的构造方法,而不能使用其它的构造方法。因此,如果想要对任意组合属性赋值,那么需要大量的构造方法,冗余度太大。
7. 自动注入
# 1. 自动注入
在spring工厂配置文件中通过制定自动注入方式 开启组件属性的自动赋值
注意:
1. 底层使用原理也是SET方式注入
2. 自动注入需要在对应组件标签开启才能使用
3. 只能用于引用类型的注入|对象类型|组件类型的注入,不能用于基本类型的注入
# 2. 自动注入语法
1. 需要谁将谁声明为成员变量,并提供SET方法
2. 在对应组件标签中加入autowired 属性并指定自动注入方式即可完成注入
需要的StudentDAO接口
StudentDAO接口的实现类
需要的StudentService接口
StudentService接口的实现类
配置文件
<!--管理DAO组件-->
<bean class="adi.StudentDAOImpl" name="studentDAO"></bean>
<!--管理Service组件
autowire:用来给组件中成员变量完成自动赋值操作
autowire属性值有以下两种
byType:根据类型完成自动注入 根据成员变量类型去工厂找 找到对应类型完成赋值 找不到不赋值
注意:如果工厂中存在多个类型一致的组件 使用类型自动注入会报错,这时候就需要使用根据名称自动注入了
byName:根据名称完成自动注入 根据成员变量名字去工厂中获取与之一致的名字 找到对应的赋值 找不到不赋值
-->
<bean class="adi.StudentServiceImpl" name="studentService" autowire="byName"></bean>
注意:
- 如果autowire="byName"表示从工厂中找bean标签的id和成员变量的名字一样的类
- 如果autowire="byType"表示从工厂中找bean标签包含的类的类型和成员变量类型一样的类
补充
- 工厂中所含的类表示的是所有由bean标签的class属性指向的类
- 在使用根据类型自动注入时,如果工厂中的多个类都能与成员变量类型对应,则会报错,这时候就需要使用根据名字自动注入了。