一.setter注入
1.bean注入
在bean中定义引用类型属性并提供可访问set方法
public class BookServiceImpl implements BookService{
private BookDao bookDao;
private UserDao userDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
对应在xml中加入property
<bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
2.简单类型注入(数字字符串)
public class BookDaoImpl implements BookDao {
private int connectionNum;
private String databaseName;
public void setConnectionNum(int connectionNum) {
this.connectionNum = connectionNum;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
在XML添加对应property标签 value属性注入简单类型数据
<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
<property name="connectionNum" value="10"/>
<property name="databaseName" value="mysql"/>
</bean>
二.构造器注入
1.构造器bean注入
通过构造函数的方式进行bean的依赖注入
public class BookServiceImpl implements BookService{
public BookServiceImpl(BookDao bookDao, UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
private BookDao bookDao;
private UserDao userDao;
}
xml中在对应bean中加入constructor-arg属性 name的参数与构造函数中形参需要一致 ref表示关联对应bean
<bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
2.构造器简单类型注入*
public class BookDaoImpl implements BookDao {
private int connectionNum;
private String databaseName;
public BookDaoImpl(int connectionNum, String databaseName) {
this.connectionNum = connectionNum;
this.databaseName = databaseName;
}
@Override
public void save(){
System.out.println("BookDaoSave..."+databaseName+","+connectionNum);
}
}
同样在xml中添加constructor-arg属性 name的参数与构造函数中形参需要一致 value表示对应值
<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
<constructor-arg name="connectionNum" value="10"/>
<constructor-arg name="databaseName" value="mysql"/>
</bean>
额外补充
为了降低耦合度,使得name的参数修改时不出问题曾使用下面的方法代替使用name
按类型type区分,但是 这种方法在面临多种同类型参数的时候都有局限性
<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
<constructor-arg type="int" value="10"/>
<constructor-arg type="java.lang.String" value="mysql"/>
</bean>
按参数的前后位置顺序index区分
<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="mysql"/>
</bean>
依赖注入方式的选择
1.强制依赖使用构造器进行,使用setter方法注入有概率不注入导致null对象出现
2.可选依赖使用setter注入进行,灵活性强
3.spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,用构造器注入完成强制依赖注入,使用setter注入完成可选依赖的注入
5.根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入
依赖的自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
<!-- 按类型type匹配bean类型需要唯一
按名称匹配id需要唯一且与service中的setBean方法中的要一致-->
<!-- 主要使用的是按类型byType-->
<bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl" autowire="byName">
注意事项
1.自动装配仅用于引用类型依赖注入,不能对简单类型进行操作
2.按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3.使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐
4.自动装配优先级低于setter注入和构造器注入,同时出现时自动装配配置失效
集合注入
public class BookDaoImpl implements BookDao {
private int[] array;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
public void setArray(int[] array) {
this.array = array;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public void save(){
System.out.println("BookDaoSave...");
System.out.println("遍历数组:"+ Arrays.toString(array));
System.out.println("遍历List:"+list);
System.out.println("遍历set:"+set);
System.out.println("遍历Map:"+map);
System.out.println("遍历Properties:"+properties);
}
}
对应xml
<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
<property name="array">
<array>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</array>
</property>
<property name="list">
<list>
<value>q</value>
<value>w</value>
<value>e</value>
</list>
</property>
<property name="set">
<set>
<value>a</value>
<value>s</value>
<value>d</value>
<value>d</value>
</set>
</property>
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="hubei"/>
<entry key="city" value="wuhan"/>
</map>
</property>
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">hubei</prop>
<prop key="city">wuhan</prop>
</props>
</property>
</bean>
运行结果
注意事项
1.List和Array在xml中可以互相交换写法使用,但不推荐
2.Set集合中重复的不会输出