Spring DI注入技术
Posted TracyDemo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring DI注入技术相关的知识,希望对你有一定的参考价值。
1概念:Dependence injection 依赖注入技术
DI技术解决组件装配问题,不是对象创建问题,对象默认采用无参构造函数
容器与bean对象建立关系,实现注入途径DI注入
DI注入会自动将调用者需要的对象实例注入给调用者,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入
2.两种注入方式
a..Spring的setter注入
在实体类中构造setter方法,基本类型value注入,对象类型ref注入,属性与成员变量不是同一个概念,此属性对应setter方法成员变量
b.构造器注入
<constructor-arg index="" value=""></constructor-arg>,默认通过有参构造,进行参数注入,在实体类中必须构造有参函数
根据参数个数,参数类型就行注入,有局限性
c.自动装配(自动注入)
可以简化Xml配置,使用autowire取值
no-不采用自动装配
byName-根据bean的属性值或者id属性值进行注入
byType-根据类型进行注入,不识别id,会发生冲突
constructor-应用于构造器参数
Card类
public class Card { private String suit; private int point;
CardPlayer类
public class CardPlayer { private String name; private int age;
public class MsgBean { private String name; private int length; private List<String> friends; private Set<String> familys; private Map<String,String> phones; private Properties address;//属性集合属性
private Card card; private CardPlayer() { super(); // TODO Auto-generated constructor stub } private CardPlayer(String name, int age, Card card) { super(); this.name = name; this.age = age; this.card = card; }
Xml里面bean组件配置
<bean id="card" class="com.tracy.bean.Card">
<property name="suit" value="红桃"></property>
<property name="point" value="13"></property>
</bean>
<!-- ref 直接引用id=“card” -->
<bean id="player" class="com.tracy.bean.CardPlayer">
<property name="name" value="赌王"></property>
<property name="age" value="19"></property>
<property name="card" ref="card"></property>
</bean>
<!-- 构造器注入 默认调用有参构造 -->
<bean id="player2" class="com.tracy.bean.CardPlayer">
<constructor-arg index="0" value="啊哈哈"></constructor-arg>
<constructor-arg index="1" value="200"></constructor-arg>
<constructor-arg index="2" ref="card"></constructor-arg>
</bean>
自动装载数据类型
<!-- setter注入 --> <bean id="card" class="com.tracy.bean.Card"> <property name="suit" value="红桃"></property> <property name="point" value="13"></property> </bean> <!-- ref 直接引用id=“card” --> <bean id="player" class="com.tracy.bean.CardPlayer"> <property name="name" value="赌王"></property> <property name="age" value="19"></property> <property name="card" ref="card"></property> </bean> <!-- 构造器注入 默认调用有参构造 autowire="no" 自动化装配未开启 byName按名字装配--> <bean id="player2" class="com.tracy.bean.CardPlayer" autowire="constructor"> <constructor-arg index="0" value="王八"></constructor-arg> <constructor-arg index="1" value="100"></constructor-arg> </bean>
3.Bean参数注入
基本数据类型的注入:short int byte long float double String boolean
<!--基本数据类型进行注入--> <bean id="player" class="com.tracy.bean.CardPlayer"> <property name="name"> <value>赌王</value> </property> <property name="age" > <value>18</value> </property> <property name="card" > <null></null> </property> </bean>
4.集合注入
List Map Set Property
List注入允许重复 Set注入set不允许重复,可以排重
XML文件配置
<bean id="msg2" class="com.tracy.bean.MsgBean">
<property name="name" value="你的好友列表"></property>
<property name="length" value="4"></property>
<!--list集合注入 -->
<property name="friends">
<list>
<value>小明</value>
<value>小王</value>
<value>小张</value>
<value>小小</value>
<value>小小</value>
</list>
</property>
<!--set集合注入 -->
<property name="familys">
<set>
<value>小明</value>
<value>小王</value>
<value>小张</value>
<value>小小</value>
<value>小小</value>
</set>
</property>
<!-- Map集合注入 -->
<property name="phones">
<map>
<entry key="小赵" value="1772512999"></entry>
<entry key="小钱" value="1777777800"></entry>
<entry key="小孙" value="1777777800"></entry>
<entry key="小李" value="1777777800"></entry>
</map>
</property>
<property name="address">
<props>
<prop key="小周">兰州</prop>
<prop key="小吴">北京</prop>
<prop key="小郑">重庆</prop>
<prop key="小王">云南</prop>
</props>
</property>
</bean>
实体类
public class MsgBean { private String name; private int length; private List<String> friends; private Set<String> familys; private Map<String,String> phones; private Properties address;//属性集合属性
5.单独自定义集合类
<!-- setter注入 --> <bean id="msg" class="com.tracy.bean.MsgBean"> <property name="name" value="你的好友列表"></property> <property name="length" value="4"></property> <property name="friends" ref="myFriends"></property> <property name="address" ref="myDress"> </property> </bean> <!--自定义集合类型 --> <util:list id="myFriends"> <value>小明</value> <value>小王</value> <value>小张</value> <value>小小</value> </util:list> <util:properties id="myDress"> <prop key="小周">兰州</prop> <prop key="小吴">北京</prop> <prop key="小郑">重庆</prop> </util:properties>
6.什么时候调用无参构造,什么时候调用有参构造
a。xml配置文件
<!-- setter注入 --> <bean id="card" class="com.tracy.bean.Card"> <property name="suit" value="红桃"></property> <property name="point" value="13"></property> </bean> <!-- setter注入 --> <bean id="card2" class="com.tracy.bean.Card"> <property name="suit" value="红桃"></property> <property name="point" value="13"></property> </bean> <!-- ref 直接引用id=“card” --> <bean id="player" class="com.tracy.bean.CardPlayer"> <property name="name" value="赌王"></property> <property name="age" value="19"></property> <property name="card" ref="card"></property> </bean> <!-- 构造器注入 默认调用有参构造 autowire="no" 自动化装配未开启 byName按名字装配--> <bean id="player2" class="com.tracy.bean.CardPlayer" autowire="byName"> <constructor-arg index="0" value="王八"></constructor-arg> <constructor-arg index="1" value="100"></constructor-arg> </bean>
b。测试方法
@Test public void beanDIAuto() { ApplicationContext appContext=new ClassPathXmlApplicationContext("com/tracy/xml/bean-DI-Auto.xml"); CardPlayer player2=appContext.getBean("player2",CardPlayer.class); System.out.print("自动装载"+player2); }
c。测试结果
d。总结,autowire=byName 按照名字自动装载,Spring容器默认scope为singleton,单例模式,容器启动时创建对象,默认通过无参函数构造对象,通过setter方法在进行注入,注意是进行调用方法进行注入,不是直接赋值。
card无参构造调用两次,创建对象,cardPlayer调用了一次无参构造,setter构造调用setter方法,一次有参构造,构造器注入,默认调用有参构造,通过有参函数注入
注意:有参构造函数注入参数,对象的创建与注入是一起,不在单独调用无参函数进行对象创建
以上是关于Spring DI注入技术的主要内容,如果未能解决你的问题,请参考以下文章