spring的DI.IoC是什麽
最近要搞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是什麽