DI介绍
DI (Dependency Injection) 依赖注入
首先要明白:
is a:自己是一个什么,在程序中即继承或接口,比如汽车是交通工具。
has a:有一个,程序中即有一个成员变量,换句话说就是类B中的代码有对类A的引用
class B{
private A a;//B类依赖A类
}
依赖注入解释
依赖:一个对象需要使用另一个对象
注入:通过setter方法进行另一个对象实例设置。
- 例如:
class BookServiceImpl{
//之前开发:接口 = 实现类 (service和dao耦合)
//private BookDao bookDao = new BookDaoImpl();
//学习spring之后 (解耦:service实现类使用dao接口,不知道具体的实现类)
private BookDao bookDao;
setter方法
}
要想使用DI 一定要为字段提供setter方法
模拟spring执行过程
创建service实例:BookService bookService = new BookServiceImpl() -->IoC 配置信息(bean)
创建dao实例:BookDao bookDao = new BookDaoImple() -->IoC 配置信息(bean)
将dao设置给service:bookService.setBookDao(bookDao); -->DI 配置信息(property)
目标类
创建目标类的过程为:
* 创建BookService接口和实现类
* 创建BookDao接口和实现类
* 将dao和service配置xml到文件
创建BookService接口和实现类
package com.scx.di.test;
public interface BookService {
public void addBook();
}
package com.scx.di.test;
public class BookServiceImpl implements BookService{
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook() {
bookDao.addBook();
}
}
创建BookDao接口和实现类
package com.scx.di.test;
public interface BookDao {
public void addBook();
}
package com.scx.di.test;
public class BookDaoImpl implements BookDao{
@Override
public void addBook() {
System.out.println("BookDaoImpl add a book.");
}
}
将dao和service配置xml到文件
模拟Spring过程
创建service实例:BookService bookService = new BookServiceImpl() –>IoC 配置信息(bean)
创建dao实例:BookDao bookDao = new BookDaoImple() –>IoC 配置信息(bean)
将dao设置给service:bookService.setBookDao(bookDao); –>DI 配置信息(property)
<?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">
<!-- bean definitions here -->
<bean id="BookServiceId" class="com.scx.di.test.BookServiceImpl">
<property name="bookDao" ref="BookDaoId"></property>
</bean>
<bean id="BookDaoId" class="com.scx.di.test.BookDaoImpl"></bean>
</beans>
Junit测试
package com.scx.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.scx.di.test.BookDao;
import com.scx.di.test.BookDaoImpl;
import com.scx.di.test.BookService;
import com.scx.di.test.BookServiceImpl;
public class TestDI {
@Test
public void testDI(){
//之前开发
BookDao bookDao=new BookDaoImpl();
BookServiceImpl bookService1=new BookServiceImpl();
bookService1.setBookDao(bookDao);
bookService1.addBook();
//学习Spring后
String xmlPath="com/scx/di/test/applicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
BookService bookService2=applicationContext.getBean("BookServiceId",BookService.class);
bookService2.addBook();
}
}