控制反轉
控制反轉,當某個Java對象(調用者)需要調用另一個Java對象(被調用者,即被依賴對象)時,在傳統模式下,調用者通常會采用“new 被調用者”的代碼方式來創建對象,這種方式會導致調用者與被調用者之間的耦合性增加,不利於后期項目的升級和維護。
在使用Spring框架之后,對象的實例不再由調用者來創建,而是由Spring容器來創建(本質是反射機制),Spring容器會負責控制程序之間的關系,而不是由調用者的程序代碼直接控制。這樣,控制權由應用代碼轉移到Spring容器,控制權發生了反轉,這就是Spring的控制反轉。
依賴注入
實際上,依賴注入和控制反轉的含義相同,只不過這兩個稱呼是從兩個角度描述的統一概念。
從Spring容器的角度來看,Spring容器負責將被依賴對象賦值給調用者的成員變量,這相當於為調用者注入了它依賴的實例。
-
屬性setter方法注入
-
構造器方法注入
下面主要解釋一下屬性setter方法注入
public interface UserDao {
public void say();
}
public class UserDaoImpl implements UserDao{
public interface UserService {
public void say();
}
public class UserServiceImpl implements UserService{
private UserDao userDao;
//通過setter()依賴注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public class TestDI {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.say();
}
}