Spring IoC与DI(依赖注入)

Spring Ioc

所谓控制反转,即将传统的需要代码进行的操作,交由Spring容器来做。下面以添加book为例进行比较一下:
BookService.java

public interface BookService {
	void addBook();
}

BookServiceImpl .java

public class BookServiceImpl implements BookService {
	@Override
	public void addBook() {
		System.out.println("add book by ioc");
	}

}

Spring 配置文件

<?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="bookService" class="[包名].bookServiceImpl"></bean>
</beans>

测试:

public class TestIoc {
	
	@Test
	public void demo01(){
		//传统方法
		BookService bookService= new bookServiceImpl();
		bookService.addBook();
	}
	
	@Test
	public void demo02(){
		//从spring容器获得
		//1 获得容器
		ApplicationContext applicationContext = 
                                new ClassPathXmlApplicationContext("com/spring/ioc/beans.xml");
		
	    //2获得内容 --不需要自己new,都是从spring容器获得
		BookService bookService= (BookService ) applicationContext.getBean("bookService");
		bookService.addBook();
	}

}

DI(Dependency Injection)

has a:有一个,成员变量,依赖。
class B {
private A a; //B类依赖A类
}
依赖:一个对象需要使用另一个对象
注入:通过setter方法进行另一个对象实例设置。
举例如下:

public interface BookDao {
	void save();
}
public class BookDaoImpl implements BookDao{
	@Override
	public void save(){
		System.out.println("DI -> add a book");
	}
}
public interface BookService {
	void addBook();
}
public class BookServiceImpl implements BookService {
	private BookDao bookDao;
	
	public void setBookDao(BookDao bookDao){
		this.bookDao=bookDao;
	}

	@Override
	public void addBook() {
		this.bookDao.save();
	}

}
public class TestDI {
	
	@Test
	public void demo01(){	
		String xmlPath = "com/*/spring/ioc2/beans.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		BookService bookService = (BookService) applicationContext.getBean("bookService");
		bookService.addBook();
	}
}
<?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">

<!-- 
	模拟spring执行过程
		创建service实例:BookService bookService = new BookServiceImpl()	IoC  <bean>
		创建dao实例:BookDao bookDao = new BookDaoImpl()			IoC
		将dao设置给service:bookService.setBookDao(bookDao);		DI   <property>
		
		<property> 用于进行属性注入
			name: bean的属性名,通过setter方法获得
			ref :另一个bean的id值的引用
	 -->

<bean id="bookService" class="[包名].BookServiceImpl">
	<property name="bookDao" ref="bookDao"></property>
</bean>

<bean id="bookDao" class="[包名].BookDaoImpl"></bean>
</beans>

大家有兴趣也可以关注我的公众号查看文章。

原文地址:https://www.cnblogs.com/caozz/p/iocanddi.html