首先我们明确一些观点
1、在bean中定义引用类型属性,并提供可访问的set方法
2、 配置中使用property标签ref属性注入引用类型对象
其实把ref地址改成value值就好了。
1、我们首先在dao层类中加入数据如下(在BookDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法)
2、我们在配置文件中修改赋值(在applicationContext.xml配置文件中使用property标签注入)
对于setter注入方式的基本使用就已经介绍完了,
- 对于引用数据类型使用的是 < property name=“” ref=“”/>
- 对于简单数据类型使用的是 < property name=“” value=“”/>
1、删除setter方法并提供构造方法(在BookServiceImpl类中将bookDao的setter方法删除掉,并添加带有bookDao参数的构造方法)
2、配置文件中进行配置构造方式注入
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="bookDao" ref="bookDao"/>
bean>
其实也只是换一个属性罢了。
name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
ref属性指向的是spring的IOC容器中其他bean对象。
构造器注入简单类型也类似咯。我们不在赘述。
- 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现强制依赖指对象在创建的过程中必须要注入指定的参数
- 可选依赖使用setter注入进行,灵活性强可选依赖指对象在创建过程中注入的参数可有可无
- Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
- 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注
入- 自己开发的模块推荐使用setter注入
先来熟悉一下自动装配的定义:IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。
自动装配的方式:按类型(常用);按名称 ; 按构造方法 ; 不启用自动装配
按类型(常用):
<bean class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
按名称:
<bean class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>
在这里我们值得注意的是关于名字我们依据的是什么名字?
如果按照名称去找对应的bean对象,找不到则注入Null
最后对于依赖注入,需要注意一些其他的配置特征:
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
前面我们看了应用类型和基本类型的注入,那如果是Map呢、set呢,这些集合怎么办捏?
1、在类中编写属性并基于其构造方法(所以是setter注入啦)
2、编写xml文件(按规定的格式)
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="array">
<array>
<value>100value>
<value>200value>
<value>300value>
array>
property>
<property name="list">
<list>
<value>itcastvalue>
<value>itheimavalue>
<value>boxueguvalue>
<value>chuanzhihuivalue>
list>
property>
<property name="set">
<set>
<value>itcastvalue>
<value>itheimavalue>
<value>boxueguvalue>
<value>boxueguvalue>
set>
property>
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
map>
property>
<property name="properties">
<props>
<prop key="country">chinaprop>
<prop key="province">henanprop>
<prop key="city">kaifengprop>
props>
property>
bean>