Spring核心之對 IOC的理解
Spring核心之對 IOC的理解
Spring是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器框架。
一 、IOC
IOC : Inversion of Control,中文譯為“控制反轉
Ioc意味著將設計好的對象交給容器控制,而不是傳統的在對象內部直接通過new進行創建對象。
傳統的程序設計是通過new主動創建對象,然後再通過對象調用方法,類似以下代碼:
1 、先創建一個接口:
- public interface UserDao {
- public void save();
- }
2 、創建接口的實現類:
- public class UserDaoImpl implements UserDao {
-
- @Override
- public void save() {
- System.out.println("save方法執行了..."
); - }
-
- }
3、編寫一個測試類:通過new主動創建對象並調用方法
- public class SpringDemo1 {
-
- @Test
- /**
- * 傳統方式的調用
- */
- public void demo1(){
- UserDao userDao = new UserDaoImpl(); //創建對象
- userDao.save(); //通過對象調用方法
- }
-
- }
這樣的程序設計會導致類與類之間高耦合,一旦後期維護,程序不想通過UserDaoImpl 來實例化userDao對象,而想通過另一個實現類 UserDaoIocImpl 來實例化userDao對象 ,就需要修改源代碼為 UserDao userDao = new UserDaoIocImpl();
IOC :將設計好的對象交給容器控制,由容器幫我們創建並實例化對象 ,而我們可以通過外部xml配置文件來告訴容器我們需要哪個實現類來實例化對象 ,一旦我們需要更改實現類,則直接修改xml配置文件即可。就能夠在不修改源代碼的情況下,維護程序。
首先編寫一個將對象交給容器控制的程序:
1 、先創建一個接口:
- public interface UserDao {
- public void save();
- }
2 、創建接口的實現類:
- public class UserDaoImpl implements UserDao {
-
- @Override
- public void save() {
- System.out.println("IOC容器調用的save方法執行了...");
- }
-
- }
3 、創建applicationContext.xml配置文件,將實現類交給Spring管理,即告訴容器調用哪個實現類實例化對象
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-
- <!-- 設置一個id, class為實現類的全路徑,告訴容器調用這個實現類實例化對象-->
- <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean>
-
- </beans>
4 、編寫測試類
- public class SpringDemo1 {
-
- @Test
- /**
- * Spring IOC容器的方式的調用
- */
- public void demo2(){
- // 創建Spring的工廠來加載xml配置文件
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- //讀取到我們告訴容器需要哪個實現類來實例化對象
- UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此處的參數為xml配置文件中 <bean>標簽中id的值
- userDao.save();
- }
當我們需要將實現類UserDaoImpl更換為UserDaoIocImpl時,只需修改xml配置文件<bean>標簽中 class 的路徑,將其修改為UserDaoIocImpl 類的全路徑即可,其余代碼無需修改
<bean id="userDao" class="com.czm.spring.demo1.UserDaoIocImpl"></bean>
二 、DI
DI :Dependency Injection,即“依賴註入” 。在IOC環境下,Spring管理的這個實現類在執行時依賴的一些屬性,可直接在類 中註入,以供使用。
1 、比如 UserDaoImpl 實現類在執行時需要用到 name 屬性,可直接定義 name 屬性並提供 set 方法
- public class UserDaoImpl implements UserDao {
- //依賴註入
- private String name;
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public void save() {
- System.out.println("save方法執行了..."+name); //執行時直接使用註入的屬性
- }
-
- }
在xml配置文件中通過<property>標簽為 name 屬性賦值
- <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl">
- <property name="name" value="依賴註入的name屬性"></property>
- </bean>
2 、當我們需要 調用業務層 Service 方法時 也可註入Service ,前提是在IOC環境下,即Service實現類也交給了Spring 管理了
註入Service,提供 set 方法
- //註入Service
- private UserService userService;
- //提供Set方法
- public void setUserService(UserService userService) {
- this.userService = userService;
- }
在xml配置文件中通過<property>標簽來配置Service ,name 和 ref 屬性值與配置Service 是 id 值相同
可直接調用Service 方法
- public String regist(){
- userService.regist(user); //調用依賴註入的Service方法
- return LOGIN;
- }
Spring核心之對 IOC的理解