srping为我们提供了两种注入方法:setter注入和构造器注入
1、setter注入
1.1、注入引用数据类型
- 在bean中定义引用类型属性,并提供可访问的set方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
- 配置中使用property标签ref属性注入引用类型对象
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>
<bean id="bookService" class="com.AT.service.impl.BookServiceImpl">
<!--配置service与dao的关系-->
<!--property标签表示配置当前Bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个Bean
-->
<property name="bookDao" ref="bookDao"></property>
</bean>
1.2、注入简单数据类型
- 在类中声明对应的普通数据类型的属性,并提供set方法
public class BookDaoImpl implements BookDao {
private String databaseName;
private int maxInt;
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void setMaxInt(int maxInt) {
this.maxInt = maxInt;
}
}
- 配置文件中进行注入配置
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
<property name="databaseName" value="AT"></property>
<property name="maxInt" value="15110"></property>
</bean>
2、构造器注入
构造器注入也就是构造方法注入。
2.1、构造器注入引用数据类型
- 将bookserviceImpl类中的bookda的setter方法删除掉,并添加带有bookDao参数的构造方法。
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
}
- 配置文件中进行配置构造方法注入
<bean id="bookService" class="com.AT.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
</bean>
说明:
- name属性对应的值为构造函数中方法形参的参数名,必须保持一致。
- ref属性指向的是spring的IOC中的其他bean对象
2.2、构造器注入简单数据类型
- 再类中添加构造方法
public class BookDaoImpl implements BookDao {
private String databaseName;
private int maxInt;
public BookDaoImpl(String databaseName, int maxInt) {
this.databaseName = databaseName;
this.maxInt = maxInt;
}
}
- 在配置文件中进行配置注入
(1)根据形参名【name属性】
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
<constructor-arg name="databaseName" value="AT"></constructor-arg>
<constructor-arg name="maxInt" value="15110"></constructor-arg>
</bean>
(2)按照类型注入【type属性】
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
<constructor-arg type="java.lang.String" value="AT"></constructor-arg>
<constructor-arg type="int" value="15110"></constructor-arg>
</bean>
(3)按照索引下标注入【index属性】
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
<constructor-arg index="0" value="AT"></constructor-arg>
<constructor-arg index="1" value="15110"></constructor-arg>
</bean>
3、依赖注入小结
介绍完两种参数的注入方式,具体的我们该如何选择呢?
(1)强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
- 强制依赖指对象再创建的过程中必须要注入指定的参数
(2)可选依赖使用setter注入进行,灵活性强
- 可选依赖指对象在创建过程中注入的参数可有可无
4、自动装配
- IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。
- 自动装配有按类型(常用)、按名称、按构造方法、不启用自动装配
4.1、完成自动装配的配置
自动装配只需要修改applicationContext.xml配置文件即可:
将<property>标签删除
在<bean>标签中添加autowire属性
<bean id="bookService" class="com.AT.service.impl.BookServiceImpl" autowire="byType"></bean>
注意事项:
- 需要注入属性的类中对应属性的setter方法不能省略。
- 被注入的对象必须要被Spring的IOC容器管理
- 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException
其他的配置特征:
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
5、集合注入
5.1、注入数组类型数据
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
5.2、注入List类型数据
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
5.3、注入Set类型数据
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
5.4、注入Map类型数据
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
5.5、注入Properties类型数据
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
说明:
- property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写 <array>、<list>、<set>、<map>、<props>标签
- List的底层也是通过数组实现的,所以<list>和<array>标签是可以混用
- 集合中要添加引用类型,只需要把<value>标签改成<ref>标签,这种方式用的比较少