Spring学习笔记
三、依赖注入
1.手动注入
1.1 构造器注入
这种方法不常用,首先在类中写好一个构造方法
public BookDaoImpl(String name, String author, int price) {
this.name = name;
this.author = author;
this.price = price;
}
然后在xml中使用constructor-arg标签进行配置
<bean name="book" class="love.ceyx.dao.Impl.BookDaoImpl">
<constructor-arg name="author" value="张三"/>
<constructor-arg name="name" value="刑法大全"/>
<constructor-arg name="price" value="10000"/>
</bean>
注意,如果是引用数据类型,那么需要把value替换成ref去绑定类型。
这里的name属性对应的值需要跟构造器中形参的名字一样,耦合度较高。另外还有两种方法
一是使用type属性去指定参数的类型,让其按照类型匹配,但是仅适用于传入的参数类型各不相同,如果有两个相同的类型,这种方法就行不通。
<constructor-arg type="java.lang.String" value="张三"/>
二是按照顺序匹配,使用index属性指定参数在形参列表中的顺序,如:
<constructor-arg index="0" value="刑法大全"/>
1.2 setter注入
此方法较为便捷,且耦合度较低,首先类中需要给依赖定义一个setter
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
然后配置文件使用property标签
<bean name="bookService" class="love.ceyx.service.Impl.BookServiceImpl">
<property name="bookDao" ref="book"/>
</bean>
注意name对应的值是依赖的setter方法中形参的名字。
2. 自动注入
自动注入最为简单快捷,但只能用于引用数据类型的依赖,而不能用于基本数据类型。
自动注入有几种模式,byName、byType、constructor、default和no,前两个较为常用,defaut和no都是不启用。自动注入不能和手动注入混用。
2.1 byName
byName与setter注入相似,都是按照setter的形参列表名匹配。
<bean id="book" class="love.ceyx.dao.Impl.BookDaoImpl">
<constructor-arg type="java.lang.String" value="张三"/>
<constructor-arg index="0" value="刑法大全"/>
<constructor-arg name="price" value="10000"/>
</bean>
<bean name="bookService" class="love.ceyx.service.Impl.BookServiceImpl" autowire="byName">
形参列表中的名字需要与依赖的id一致
2.2 byType
把autowire的值替换成byType即可,按照形参列表中类型去匹配,注意xml文件中如果有两个bean的class相同,就会发生冲突(一般没人这样写),这种方式最为便捷和常用。