SpringDI 依赖注入传递参数的方式
Posted David Wu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringDI 依赖注入传递参数的方式相关的知识,希望对你有一定的参考价值。
DI依赖注入传入参数的方式,这里介绍了基本数据类型,集合,符合数据类型的传递(String类型比较特殊,其传递值和基本数据类型的方法一致)
注入基本数据类型和String类型
通过setter方法注入基本数据类型与String
案例:
<bean id="book" class="cn.xdl.bean.Book"> <!-- 对于基本数据类型 与 String的注入操作 通过set方法 ,完成注入 name: 属性的名称 value: 属性要赋的值 <null/>: 节点表示null。 --> <property name="bookName" value="西游记"></property> <property name="bookId" value="10001"></property> <!-- null值 --> <property name="x"> <null/> </property> </bean>
通过构造方法 ,注入基本数据类型与String
方式1:
<bean id="book" class="cn.xdl.bean.Book"> <!-- 通过构造器 传入形参名称 与 value值, 进行参数的注入--> <constructor-arg name="bn" value="红楼梦"></constructor-arg> <constructor-arg name="bi" value="10002"></constructor-arg> </bean>
方式2:
<bean id="book" class="cn.xdl.bean.Book"> <!-- 通过构造器 传入形参列表的索引 ,与value进行参数的注入--> <constructor-arg index="0"> <null/> </constructor-arg> <constructor-arg index="1" value="10003"></constructor-arg> </bean>
注入集合类型的数据
注入List集合
<property name="jiyoumen"> <!--向List集合 注入值--> <list> <!--每一个value节点, 表示集合中的一个元素--> <value>帅帅</value> <value>晋华</value> <value>王鹏和杨海</value> <value>昊天</value> <value>超凡和超群</value> <value>欢乐他自个儿</value> </list> </property>
注入Set集合
<property name="jiyoumen"> <!--向set集合 注入值--> <list> <!--每一个value节点, 表示集合中的一个元素--> <value>帅帅</value> <value>晋华</value> <value>王鹏和杨海</value> <value>昊天</value> <value>超凡和超群</value> <value>欢乐他自个儿</value> </list> </property>
注入Map集合
<property name="jiyoumen"> <map> <!--每一个enrty表示集合中的一个键值对--> <entry key="jiyou1" value="欢乐他自个1"></entry> <entry key="jiyou2" value="欢乐他自个2"></entry> </map> </property>
注入Properties集合
<property name="jiyoumen"> <!--对于properties的注入 ,value是编写在prop节点的文本内容区域的 每一个prop都表示proerties存储的一个键值对的数据--> <props> <prop key="1haojiyou">帅帅</prop> <prop key="2haojiyou">昊天</prop> <prop key="3haojiemei">杨海</prop> </props> </property>
通过引入的方式, 实现集合的重复利用
原理:
1. 配置一个集合对象到容器中, 并指定ID
2. 在其他对象使用时, 直接通过对象注入的方式, 将其注入即可
案例:
向容器中添加集合对象:
<util:set id="list"> <value>张三</value> <value>李四</value> <value>王二</value> <value>麻子</value> </util:set>
将对象注入其他对象中:
<bean id="person" class="cn.xdl.bean.Person"> <property name="refriendship" ref="list"></property> </bean>
对象的注入
通过Setter方法设置属性
property节点: 通过set方法, 设置一个属性的值
name属性: 表示的是 当前类中的属性的名称
ref: 表示的是, 本次要注入的对象在当前容器中的id值
案例:
<bean id="id" class="类"> <property name="book" ref="book"></property> </bean>
通过构造器设置属性
constructor节点: 通过构造器 , 注入属性的值
name属性: 这是一个容易混淆的地方 , 它指的其实是构造方法中形式参数列表中参数的名称
ref: 表示的是, 本次要注入的对象在当前容器中的id值
案例:
<bean id="id" class="类"> <constructor-arg name="book" ref="book"></constructor-arg> </bean>
对象的自动装配
我们可以在bean节点中, 添加autowire属性来完成自动装配的操作
属性取值范围:
1,no : 默认设置 , 表示关闭自动装配
2,byName : 通过名称完成自动装配:
例如: 当前我们容器中存在一个对象, id为book;
而刚好当前的这个person类中有一个名称为book的属性
那么这个时候, 我们的容器, 会自动完成两个对象的关联
byName 不会判断传入的参数类型是否匹配, 只要名称相同, 就会强行建立依赖关系 , 导致报错!
3, byType : 通过类型完成自动装配
例如: 当前我们容器中存在一个Book类的对象
而刚好我们当前的Person有一个Book类型的属性
我们的容器, 就会自动完成两个对象的关联
4,constructor 与byType的方式类似,不同之处在于它应用于构造器参数
5,autodetect 通过bean类来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式
案例:
Person类:
package cn.xdl.bean; public class Person { private String name; private int age; private Book book; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } @Override public String toString() { return "这个人叫做:" + name + ", 今年" + age + "岁了, 他有一本书:" + book ; } public Person(String name, int age, Book book) { super(); this.name = name; this.age = age; this.book = book; } public Person() { super(); // TODO Auto-generated constructor stub } public Person(Book book) { super(); this.book = book; } }
applicationContext文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd"> <bean id="book" class="cn.xdl.bean.Book"> <property name="bookName" value="水浒传"></property> <property name="bookId" value="10001"></property> </bean> <!-- <bean id="person" class="cn.xdl.bean.Person"> 通过ref 关联对象之间的关系 <constructor-arg name="book"> <null/> </constructor-arg> <constructor-arg name="name" value="张三"></constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <property name="book" ref="book"></property> </bean> --> <!-- 自动装配 byName 通过属性名称 与 容器中对象的id 匹配 --> <bean id="person" class="cn.xdl.bean.Person" autowire="byName"> <property name="name" value="小李"></property> <property name="age" value="18"></property> </bean> </beans>
Test测试类:
package cn.xdl.test; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.xdl.bean.Person; import cn.xdl.test.util.ContextUtil; public class Test { @Test public void test() throws Exception { ClassPathXmlApplicationContext context = ContextUtil.getC("bean6.xml"); Person p= context.getBean("person", Person.class); System.out.println(p);//这个人叫做:小李, 今年23岁了, 他有一本书:书名=水浒传, 编号=10001 } }
以上是关于SpringDI 依赖注入传递参数的方式的主要内容,如果未能解决你的问题,请参考以下文章
注意细节,阿里架构师一文详解SpringDI的四种依赖注入方式
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段