DI可以注入三种类型的数据
1.基本数据类型和String
参考注入方式一
2.引用类型
参考注入方式二
3.复杂一点的集合类型 List Set Map
代码:
<!-- 注入集合类型数据
<list><set>
<map><props>
-->
<bean id="userDao3" class="com.fjr.di.UserDaoImpl" >
<property name="list">
<list>
<value type="java.lang.String">冯洁茹</value>
<value type="java.lang.String">张灿</value>
</list>
</property>
<property name="set">
<set>
<value type="java.lang.String">陈粒</value>
<value type="java.lang.String">陈奕迅</value>
</set>
</property>
<property name="map">
<map>
<entry key="爱好" value="游戏"></entry>
<entry key="游戏名" value="LOL"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="身高">168cm</prop>
<prop key="年龄">18岁</prop>
</props>
</property>
</bean>
DI的两种注入方式
1.构造方法注入
在bean标签内部使用 constructor-arg标签
type属性:使用类型指定构造方法中参数的类型
index属性:使用构造方法中参数索引值来 进行注入
name属性 :使用构造方法中参数名称 来注入 ( 常用!)
value属性:要注入的值(基本数据类型和String类型)
ref属性:要注入的值(引用在IOC容器中其他的bean对象)
优点:创建时必须要指定构造方法中的全部参数,bean才能被创建,保证了对象创建出来之后,成员变量一定都有值
缺点:必须要指定全部参数,否则无法创建,使用该方式改变了对象的创建过程
代码:
<bean id="userDao1" class="com.fjr.di.UserDaoImpl">
<constructor-arg name="name" value="冯洁茹"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="birthday" ref="now"/>
</bean>
<!-- 创建一个Date类型的对象-->
<bean id="now" class="java.util.Date" ></bean>
2.setter方法注入
必须要有一个无参的构造方法,否则只能用构造方法构造
name属性:指定要注入的属性值 使用的是setter方法名中去掉set三个字母后的字符串首字母小写后的字符串
value属性:
ref属性:
优点:创建时无需指定什么参数,不会限制对象的创建
缺点:在某些场景中,必须要保证对象创建时有某些成员变量的值,无法保证
代码:
<bean id="userDao2" class="com.fjr.di.UserDaoImpl">
<property name="name" value="冯洁茹"/>
<property name="age" value="19"/>
<property name="birthday" ref="now"/>
</bean>
public class AccountImpl implements AccountDao {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}