1、什麼是控制反轉?
簡而言之,就是把對象的創建權由我們之前的手動創建現在由Spring容器來處理,對象創建的控制權發生了反轉,故而得名控制反轉,Inversion Of Control(IOC);
2、什麼叫依賴注入?
Dependency Injection是控制反轉的核心,就是把我們對象之間的依賴關係交由我們Spring容器來進行管理,也就是說動態的向某個對象提供他需要的其他對象;
3、在我們實際程序中哪裏使用到了我們的控制反轉與依賴注入?
在以下例子中,我們創建了userDao、userService接口以及其實現類,我們都知道dao用來處理持久層,也就是操作數據庫,而業務層service用來操作Dao層,所以我們寫了幾個方法來模擬這個過程;
public interface IuserDao {
public void findByUsernameAndPassowrd();
}
public class IuserDaoImpl implements IuserDao{
public void findByUsernameAndPassowrd() {
// TODO Auto-generated method stub
System.out.println("這裏是dao層的方法");
}
}
public interface IuserService {
//因爲在業務層的話一般是可以處理登錄請求的,故寫一個登錄的方法
public void login();
}
public class UserServiceImpl implements IuserService{
//在這裏我們定義一個成員變量,變量名應該對xml文件中的name相對應;
private IuserDao userDao;
//這裏給他添加一個set方法
public void setUserDao(IuserDao userDao) {
this.userDao = userDao;
}
public void login() {
// TODO Auto-generated method stub
System.out.println("這裏業務層service的 方法");
System.out.println("這裏是通過依賴注入打印出來的方法");
//使用Spring配置方式new一個對象,IOC控制反轉
//讀取Applicationcontext.xml文件,獲取Bean節點
// ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// //根據ID來獲取Bean,並且對其進行強轉
// IuserDao userDao=(IuserDao)ac.getBean("userDao");
//然後使用這個userDao對象來調用裏面的那個方法
userDao.findByUsernameAndPassowrd();
}
}
關於Service層調用Dao層對象(控制反轉)
在以上代碼中我們可以看到我們在業務層中調用了數據層Dao裏面的方法,而我們這裏沒有選擇直接在Service層創建對象,而是把對象的創建過程交給了我們的spring容器,也就是在我們的applicationContext.xml進行配置,在裏面通過bean進行創建對象,並且這個創建對象的過程使用到了我們的java反射機制,只要提供dao接口的實現類全路徑,就能創建出其dao對象,然後我們在service層使用Appplication對其進行獲取,從而可使用該對象對其進行調用dao層裏面的方法;
關於我們在test類中訪問service對象(依賴注入)
因爲我們在test方法裏面需要訪問service對象,故我們在applicationContext.xml中對對象進行注入;
<!-- 這裏的話直接把上面那個對象進行依賴注入,也就是相當於用了set/get方法 -->
<bean id="userService" class="com.runxun.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
注意:我們這裏需要使用property對userDao進行注入,這個name必須是我們在seivice層實現類中的創建的dao層對象名,並且給其添加一個set方法,通過該方法進行依賴注入之後在service實現類中我們就可以直接使用該dao對象來調用Dao層裏面的方法而無須像之前一樣使用applicationContext進行對象獲取;