依赖注入是指,spring在创建对象A时(A依赖于B),自动将B注入的过程
如service依赖dao,spring将自动创建dao,并通过service提供的set方法进行设置(注入)。
is a 与has a的区别
is a –>是什么? –> 继承(父子类)
has a –> 有一个 –> 依赖
依赖注入原理
现在有BookService与BookDao,BookTest 三个类,BookService依赖于BookDao,BookTest用于测试。
public class BookService {
//传统写法,
// private bookDao book = new bookDao();
//新写法,利用setter注入
private BookDao bookDao;
public void addBook() {
bookDao.save();
}
//bookDao 的setter方法
public void setBook(BookDao book) {
this.bookDao = book;
}
}
public class BookDao {
public void save() {
System.out.println("save book");
}
}
public class BookTest {
@Test
public void testDemo1() {
BookDao bookDao = new BookDao();
BookService bookService = new BookService();
bookService.setBook(bookDao);
//在此处调用BookService中的addBoook()方法
//需要做如上的准备工作(创建bookDao,bookService对象,并创建两个对象之间的依赖关系)
bookService.addBook();
}
}
修改BookTest 中的代码,添加配置文件,实现依赖注入思想
在applicationContext.xml中添加如下代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建bookDao对象-->
<bean id="bookDao" class="com.xiaowang.b_di.BookDao"></bean>
<!--创建bookService对象-->
<bean id="bookService" class="com.xiaowang.b_di.BookService">
<!-- 该段代码 执行的就是依赖注入的过程,底层将执行setter方法
name 应填入对象的属性,该属性是根据bookService的setter方法推导出来的(而不是直接获取到的对象属性),
setBookDao -> bookDao (由setBookDao方法名,推出bookDao 属性名)
ref 应填入其对象的引用,
-->
<!-- 就是说给bookService对象的bookDao属性赋值,其值为bookDao对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
</beans>
注意 :
<bean id="bookDao" class="com.xiaowang.b_di.BookDao"></bean>
相当于 BookDao bookDao=newBookDao();
<property name="bookDao" ref="bookDao"></property>
相当于 bookService.setBookDao("bookDao");
做好如上配置,我们就可以修改BookTest的代码了。
public class BookTest {
@Test
public void testDemo2() {
// 从spring容器中获取内容
// 1 获得容器
String xmlPath = "com/xiaowang/b_di/applicationContext.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
// 获得对象
BookService bookService = applicationContext.getBean("bookService", BookService.class);
bookService.addBook();
}
}
这样就能清晰明了的看到依赖注入的实现原理了