Spring IOC(控制反轉)
IOC控制反轉基本理念就是將程序控制權從程序員手中交給用戶自定義,從而避免了因爲用戶一個小需求的變化使得程序員需要改動大量代碼。
案例
如果按照之前javaweb的固定方法,寫一個簡單的業務邏輯
1.一個DAO接口
public interface UserDao {
public void getUser();
}
2.實現DAO接口
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("獲取用戶數據");
}
}
3.一個service接口
public interface UserService {
public void getUser();
}
4.實現service接口
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
5.測試類
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
6.新增UserDaoMySqlImpl實現UserDao接口
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql獲取用戶數據");
}
}
7.修改UserServiceImpl
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();//修改部分
@Override
public void getUser() {
userDao.getUser();
}
}
8.如果再增加一個UserDaoOracleImpl
public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("Oracle獲取用戶數據");
}
}
如果又要使用這個dao,則又需要去service中改變代碼,假設項目十分龐大,修改一個dao可能涉及幾十幾百行代碼,我們的工作量就會非常大,程序耦合性也非常高。
如何解決問題
9.在UserServiceImpl中增加一個set方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set方法,讓調用者自行選擇需要的dao
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
10.新的測試類
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );//自行選擇UserDaoMySqlImpl
service.getUser();
//如果又要用UserDaoOracleImpl,也是可以由調用者自行選擇
//service.setUserDao( new UserDaoOracleImpl() );
//service.getUser();
}
之前所有的改變都是****有****程序員去控制,現在將改變的主動權交給了調用者/用戶,程序也不用去管怎麼創建和調用了,使得程序員可以專心實現業務,只實現一個提供服務的接口,不再管理對象的創建,也降低了代碼之間的耦合度,當需求改變時也不必修改大量代碼
IOC思想
控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實現IoC的一種方法,沒有IoC的程序中 , 我們使用面向對象編程 , 對象的創建與對象間的依賴關係完全硬編碼在程序中,對象的創建由程序自己控制,控制反轉後將對象的創建轉移給第三方。
控制反轉:可以理解爲控制 對象創建 的 主動權 反轉了。原來對象創建要由我們編寫的程序控制,主動權在程序手裏,控制反轉後就將創建對象的主動權移交給第三方,這樣可以降低程序代碼間的耦合性,減少了修改代碼的工作量。
在Spring中,IOC思想的體現就是依賴注入,在xml文件中或者使用註解創建對象交由IOC容器管理,之後獲取對象就不再通過new 對象,而是通過配置文件從IOC容器中獲取對象,之後修改就不需要改動程序,而只需要在xml配置文件中進行修改 ,將對象交由Spring去創建、管理、裝配。