1. 程式人生 > >spring的DI.IoC是什麽

spring的DI.IoC是什麽

.com lns 反轉 dep 分代 his clas 一個 編寫

最近要搞spring的單元測試,不得已啊啊啊啊啊啊啊啊啊又要開始搞spring……

日目晶……

搞這幾個概念,先甩一部分代碼:

UserDao 接口

package com.itheima.ioc;
public interface UserDao {
	public void say();
}

 

該接口實現類UserDaoImpl

package com.itheima.ioc;
public class UserDaoImpl implements UserDao {
	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("userDao say hello world");
	}
}

 

  • 控制反轉的概念

在一般的設計中,如果要調用UserDaoImpl的say()方法,就要new一個UserDaoImpl類出來,比如以下的方法:

……
UserDaoImpl userDao = new UserDaoImpl();
userDao.say();
……  

在spring中呢,有個概念叫IoC(Inversion of Control 即控制反轉),它通過框架設定,可以通過配置文件,在spring的容器(可以理解為一個裝滿了對象的瓶子)中取一個現成的UserDaoImpl的實例出來,而不需要new一個。

具體做法:

編輯applicationContext.xml,添加一個userDao的bean(可以理解為一個類,添加之後,spring容器中就有這個類的對象)

<?xml version="1.0" encoding="UTF-8"?>
<beans ……>
	<!-- 添加UserDaoImpl實例,id=userDao -->
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
</beans>

  

調用userDaoImpl的say()方法代碼如下:

package com.itheima.ioc;
/**
 * 通過Spring容器來獲取實現類對象
 * 而不是通過new
 */
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoc {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		userDao.say();
	}
}

  技術分享圖片

  • 依賴註入的概念

UserService代碼:

package com.itheima.ioc;
public interface UserService {
	public void say();
}

 

UserServiceImpl 實現類:

這裏的實現類中,我們要重寫say()方法,say()方法有一個現成的UserDaoImpl方法,我們直接拿過來用,一般是這麽寫的:

public class UserServiceImpl implements UserService {
	UserDao userDao=new UserDaoImpl();
	public void setUserDao(UserDao userDao){
		this.userDao= userDao;
	}
	@Override
	public void say() {
		// TODO Auto-generated method stub
		this.userDao.say();
		System.out.println("userService say hello world~");
	}
}

 

這麽寫沒問題,不過spring容器裏面有個現成的UserDaoImpl,還new一個,很浪費,直接拿過來用會更方便。

這個直接拿過來用的搞法,叫DI(Dependency Injection ,即依賴註入)。

依賴註入有兩種做法,一個是setter,一個是構造方法,這裏只給setter的方法,構造方法的我看的書上還沒講,不想動。

做法如下:

改寫UserServiceImpl,把new變成私有屬性

public class UserServiceImpl implements UserService {
	//聲明UserDao屬性
	private UserDao userDao ;
	
	public void setUserDao(UserDao userDao){
		this.userDao= userDao;
	}
	@Override
	public void say() {
		// TODO Auto-generated method stub
		this.userDao.say();
		System.out.println("userService say hello world~");
	}
}

  

編寫配置文件,把userDao Bean添加到userService下面:

<beans xmlns="……">
	<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
	<bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
	<!-- 將id=userDao的實例註入到userSericeImpl -->
		<property name="userDao" ref = "userDao"/>
	</bean>
</beans>

  

技術分享圖片

 

 

spring的DI.IoC是什麽