基于xml方式的依赖注入
Spring中将创建对象并为其添加属性值的操作称之为依赖注入,也就是通过Spring的方式为bean属性赋值
1. XML方式
1.1. 使用set方法进行注入
- 步骤:
(1)创建类 -> 定义属性和对应的set方法
(2)在Spring配置文件配置对象创建,配置属性注入
1.1.1. 代码测试
public class Book {
// 1 创建属性
private String bname;
private String bauthor;
private String address;
// 2 创建属性对应的set方法
public void setBname(String bname) {
this.bname = bname;
}
public void setBauthor(String bauthor) {
this.bauthor = bauthor;
}
public void setAddress(String address) {
this.address = address;
}
public void testDemo(){
System.out.println("bname:"+bname+"\nbauthor:"+bauthor+"\naddress:"+address);
}
}
#############################################
Spring配置文件
<!-- set方法注入属性-->
<!-- 使用property完成属性注入,
name:类中的属性名;
value:向属性中注入的值-->
<bean id="book" class="com.spring5.demo1.Book" >
<property name="bname" value="java手册"></property>
<property name="bauthor" value="alibaba"></property>
<!-- 为属性设置null值-->
<!-- <property name="address"> -->
<!-- <null></null>-->
<!-- </property>-->
<!-- 将属性值设置特殊字符
1。例<>,进行转义 < >
2.将带有特殊符号的内容写到CDATA中-->
<property name="address" >
<value><![CDATA[<<兰州>> ]]></value>
</property>
</bean>
###############################
测试代码
public void testBook(){
//1 加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//2 获取配置创建的对象
Book book = context.getBean("book",Book.class);
book.testDemo();
}
运行结果:
1.2. 使用有参构造器进行注入
- 步骤:
(1)创建类 -> 定义属性和创建对应的有参构造器
(2)在Spring配置文件中进行配置
使用<constructor-arg >标签完成属性注入,
name:类中的属性名;
value:向属性中注入的值
index:有参构造器中的形参列表索引(有多个构造器时,选择使用哪个构造器)-->
1.2.1. 代码测试
public class Orders {
// 属性
private String oname;
private String address;
//
public Orders(String oname, String address) {
this.oname = oname;
this.address = address;
}
public void testDemo(){
System.out.println("oname:"+oname+"\naddress:"+address);
}
}
########################################
spring配置文件
<!-- 使用constructor-arg 完成属性注入,
name:类中的属性名;
value:向属性中注入的值
index:有参构造器中的形参列表索引-->
<bean id="orders" class="com.spring5.demo1.Orders">
<constructor-arg name="oname" value="篮球"></constructor-arg>
<constructor-arg name="address" value="china"></constructor-arg>
</bean>
#######################################
测试代码
@Test
public void testOrders(){
//1 加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//2 获取配置创建的对象
Orders orders = context.getBean("orders",Orders.class);
orders.testDemo();
}
运行结果:
1.3. p名称空间进行注入
- 步骤:
(1)在配置文件中添加属性 xmlns:p="http://www.springframework.org/schema/p"
(2)在bean标签中使用 p:属性名="" 方式进行属性注入
<bean id="book" class="com.spring5.demo1.Book"
p:bname="Spring注解系列笔记"
p:bauthor="小刘"
p:address="BKTY"> </bean>
测试代码如1.1.1.所示
运行结果:
1.4. 其他类型属性(固定类型)进行注入
1.4.1. null值
对应的属性值使用<null/>标签
1.4.2. 属性值包含特殊符号
(1) <![CDATA[带有特殊符号的内容 ]]> ;
(2) 使用转义字符
1.4.3. 代码测试
<bean id="book" class="com.spring5.demo1.Book" >
<property name="bname" value="java手册"></property>
<property name="bauthor" value="alibaba"></property>
<!-- 为属性设置null值-->
<property name="address">
<null></null>
</property>
<!-- 将属性值设置特殊字符
1。例<>,进行转义 < >
2.将带有特殊符号的内容写到CDATA中-->
<!-- <property name="address" >-->
<!-- <value><![CDATA[<<兰州>> ]]></value>-->
<!-- </property>-->
</bean>
null值测试:
特殊符号测试
1.5. 引用型注入
1.5.1. 外部 bean
- 要求:创建两个类:service类与dao类,在service中调用dao里的方法
(1)在service中声明dao类型的属性以及对应的set方法
(2)Spring配置文件中进行配置
1.5.1.1. 代码测试
#########################################
service类
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(){
System.out.println("service add");
// // 方式一:创建 UserDao对象调用其方法
// UserDao userDao = new UserDaoimpl();
// userDao.update();
// 方式二:spring实现
//1 创建UserDao类型的属性,生成set方法
//2 配置文件中进行配置 bean2.xml
userDao.update();
}
}
#########################################
dao实现类
public class UserDaoimpl implements UserDao {
@Override
public void update() {
System.out.println("dao update");
}
}
######################################
Spring配置
<!-- 1. service与dao对象的创建-->
<bean id="userService" class="com.spring5.service.UserService">
<!-- 注入userDao对象
name:类中的属性名
ref:创建userDao对象bean标签的id值-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.spring5.dao.UserDaoimpl"></bean>
</beans>
######################################
测试代码
public void testUserService(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = context.getBean("userService",UserService.class);
userService.add();
}
运行结果:
1.5.2. 内部bean和级联赋值
- 内部bean
(1)在实体类之间表示一对多关系
(2)Spring配置文件中进行配置
- 级联赋值
(1)Spring配置文件中进行配置
(2)需要在有对象属性的类中设置其对应的get方法)
1.5.2.1. 代码测试
- 此处举例以部门类和成员类进行举例内部 bean与级联赋值
######################################
* 部门类
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
@Override
public String toString() {
return "Dept{" +
"dname='" + dname + '\'' +
'}';
}
}
######################################
* 成员类
public class Emp {
private String ename;
private String gender;
private Dept dept; // 员工所属部门,使用对象形式表示
public Dept getDept() { // 对应的对象属性get方法
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
public void showInfo(){
System.out.println("ename:"+ename+"\ngender:"+gender+"\ndept:"+dept);
}
}
- 内部bean
######################################
* Spring配置
<!-- 1. 内部bean 创建Emp与Dept对象-->
<bean id="emp" class="com.spring5.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="james"></property>
<property name="gender" value="男"></property>
<!--2. 设置对象类型属性 -->
<property name="dept" >
<bean id="dept" class="com.spring5.bean.Dept">
<property name="dname" value="技术部"></property>
</bean>
</property>
</bean>
</beans>
######################################
* 测试代码
public void testEmp(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Emp emp = context.getBean("emp",Emp.class);
emp.showInfo();
}
测试结果
- 级联赋值
<!-- 级联赋值 创建Emp与Dept对象-->
<bean id="emp" class="com.spring5.bean.Emp">
<!--设置两个普通属性-->
<property name="ename" value="james"></property>
<property name="gender" value="男"></property>
<!--级联赋值设置对象类型属性方法一 -->
<!-- <property name="dept.dname" value="运营部"></property>-->
<!--级联赋值设置对象类型属性方法二-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.spring5.bean.Dept">
<property name="dname" value="后勤部"></property>
</bean>
</beans>
测试代码同内部 bean测试
测试结果:
此处方法一优先于方法二对属性值进行注入
1.6. 集合型属性注入
- 步骤:
1,创建类,定义数组,list,map,set类型的属性,并生成对应的set方法
2,Spring配置文件中进行配置
1.6.1. 数组类型属性
使用 <array> 标签
<property name="属性名" >
<array>
<value>注入值</value>
<value>注入值</value>
</array>
</property>
1.6.2. List集合类型属性
使用 <list> 标签
#############################################
普通list类型属性
<property name="属性名">
<list>
<value>注入值</value>
<value>注入值</value>
</list>
</property>
#############################################
值为对象的list类型属性
<property name="属性名">
<list>
<ref bean="bean1" ></ref>
<ref bean="bean2"></ref>
<ref bean="bean3"></ref>
</list>
</property>
</bean>
<!-- 创建多个bean对象-->
<bean id="bean1" class="类路径">
<property name="属性名" value="属性值"></property>
</bean>
<bean id="bean2" class="类路径">
<property name="属性名" value="属性值"></property>
</bean>
<bean id="bean3" class="类路径">
<property name="属性名" value="属性值"></property>
</bean>
1.6.3. Map集合类型属性
使用 <map> 标签
<property name="属性名">
<map>
<entry key="键名" value="键值"></entry>
<entry key="键名" value="键值"></entry>
</map>
</property>
1.6.4. Set集合类型属性
使用 <map> 标签
<property name="属性名">
<set>
<value>属性值</value>
<value>属性值</value>
</set>
</property>
1.6.5. 以上举例代码测试
- 此处以Stu类中设置各个类型属性,以Course类为对象属性进行举例
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Stu {
// 数组类型属性
private String[] course;
// List集合类型属性
private List<String> list;
// 对象List集合类型属性
private List<Course> courseList;
// Map集合类型属性
private Map<String,String> maps;
//Set集合类型属性
private Set<String> sets;
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourse(String[] course) {
this.course = course;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
public void test(){
System.out.println(Arrays.toString(course));
System.out.println(list);
System.out.println(maps);
System.out.println(sets);
System.out.println(courseList);
}
}
###################################
Course类
public class Course {
private String cname; // 课程名
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Course{" +
"cname='" + cname + '\'' +
'}';
}
}
###################################
Spring配置
<bean id="stu" class="com.spring5.collectiontype.Stu">
<!-- 数组类型属性注入-->
<property name="course" >
<array>
<value>java基础</value>
<value>python编程</value>
</array>
</property>
<!-- list类型属性注入-->
<property name="list">
<list>
<value>詹姆斯</value>
<value>勒布朗</value>
</list>
</property>
<!-- map类型属性注入-->
<property name="maps">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="PYTHON" value="python"></entry>
</map>
</property>
<!-- set类型属性注入-->
<property name="sets">
<set>
<value>Mysql</value>
<value>redis</value>
</set>
</property>
<!-- 值为对象的list类型属性注入-->
<property name="courseList">
<list>
<ref bean="course1" ></ref>
<ref bean="course2"></ref>
<ref bean="course3"></ref>
</list>
</property>
</bean>
<!-- 创建多个course对象-->
<bean id="course1" class="com.spring5.collectiontype.Course">
<property name="cname" value="Spring5框架"></property>
</bean>
<bean id="course2" class="com.spring5.collectiontype.Course">
<property name="cname" value="javaEE"></property>
</bean>
<bean id="course3" class="com.spring5.collectiontype.Course">
<property name="cname" value="SpringMVC"></property>
</bean>
</beans>
###################################
测试代码
public void testCollection(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Stu stu = context.getBean("stu",Stu.class);
stu.test();
}
运行结果:
1.7. 提取集合注入
- 步骤:
(1)在Spring配置文件中引入名称空间 util
(2)使用util标签完成list集合注入提取
1.7.1. 代码测试
public class Books {
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
public void testbooks() {
System.out.println( "books{" +
"list=" + list +
'}');
}
}
##########################################
Spring配置
<!-- 1。提取list集合类型属性注入-->
<util:list id="booksList">
<value>java修炼之路</value>
<value><![CDATA[
<<java手册>>
]]></value>
<value>《jvm调优》</value>
<value><![CDATA[
<<Spring实战>>
]]></value>
</util:list>
<!-- 2。提取list集合类型属性注入使用-->
<bean id="books" class="com.spring5.collectiontype.Books" scope="prototype">
<property name="list" ref="booksList"></property>
</bean>
</beans>
##########################################
测试代码
public void testCollection1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean55.xml");
Books books = context.getBean("books", Books.class);
books.testbooks();
}
测试结果: