1 setter注入
¤ 简单类型
♦ 在bean中定义引用类型发展并提供可访问的set方法
public class BookDaoImpl implements BookDao
{
private int connectionNumber;
public void setConnectionNumber(int connectionNumber)
{
this.connectionNumber= connectionNumber;
}
}
♦ 配置中使用property标签value属性注入简单类型数据值
<bean id="bookDao" class="com.feiyan.BookDaoImpl">
<property name="connectionNumber" value="10"/>
</bean>
¤ 引用类型
♦ 在bean中定义引用类型发展并提供可访问的set方法
public class BookServiceImpl implements BookService
{
private BookDao bookDao;
public void setBookDao(BookDao bookDao)
{
this.bookDao = bookDao;
}
}
♦ 配置中使用property标签ref属性注入引用类型对象
<bean id="bookService" class="com.feiyan.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.feiyan.BookDaoImpl"/>
2 构造器注入
¤ 简单类型
♦ 在bean中定义引用类型发展并提供可访问的构造方法
public class BookDaoImpl implements BookDao
{
private String databaseName;
private int connectionNumber;
pubolic BookDaoImpl(String databaseName, int connectionNumber)
{
this.databaseName = databaseName;
this.connectionNumber = connectionNumber;
}
}
♦ 配置中使用construct-arg标签name ref属性注入简单类型数据值 有三种方法
• 第一种方法,name=属性名,存在耦合
<bean id="bookDao" class="com.feiyan.BookDaoImpl">
<construct-arg name="databaseName" value="sql"/>
<construct-arg name="connectionNumber" value="10"/>
</bean>
• 第二种方法,使用type=值类型,不能解决多个同类型属性
<bean id="bookDao" class="com.feiyan.BookDaoImpl">
<construct-arg type="java.lang.String" value="sql"/>
<construct-arg type="int" value="10"/>
</bean>
• 第三种方法,使用index=位置,不能解决多个同类型属性
<bean id="bookDao" class="com.feiyan.BookDaoImpl">
<construct-arg index="0" value="sql"/>
<construct-arg index="1" value="10"/>
</bean>
¤ 引用类型
♦ 在bean中定义引用类型发展并提供可访问的构造方法
public class BookServiceImpl implements BookService
{
private BookDao bookDao;
pubolic BookServiceImpl(BookDao bookDao)
{
this.bookDao = bookDao;
}
}
♦ 配置中使用construct-arg标签naem ref属性注入引用类型对象 注:name对应构造方法的形参名
<bean id="bookService" class="com.feiyan.BookServiceImpl">
<construct-arg name="bookDao" ref="bookDao"/>
</bean>
<bean id="bookDao" class="com.feiyan.BookDaoImpl"/>
依赖注入方式的选择
¤ 强制依赖使用构造器进行,使用setter注入有概率不进行注入造成null对象出现
¤ 可选依赖使用setter注入,灵活性强
¤ Spring框架倡导使用构造器,第三方框架内部大多采用构造器注入的形式进行数据初始化,相对严谨
¤ 如果有必要可以两者同时使用,使用构造器完成强制依赖的注入,使用setter注入完成可先依赖的注入
¤ 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
¤ 自己开发的模块推荐使用setter注入
浙公网安备 33010602011771号