前言:
控制反轉(Inversion of Control,英文縮寫為IoC)把創建對象的權利交給框架,是框架的重要特征,並非面向對象編程的專用術語。它包括依賴注入(Dependency Injection,簡稱DI)和依賴查找(Dependency Lookup)。初探Spring,當看到這句話的時候,突發奇想其實IOC是不是就是一個單例模式的對象創建工具呢。Spring在創建之初會根據配置文件和代碼中的注解,分析哪些Bean是需要創建的,於是將該類對象一一創建到緩存中,當接收到前端請求時,調用到對應的對象就去緩存池里面找,那么到底是不是這個意思呢?於是我來做一個小小的測試。
實驗原理:
1、搭建Spring框架,使之能正常進行依賴注入
2、注入一個帶有屬性的普通對象A到容器中,這個普通對象A有一個帶有getter和setter的屬性
3、編寫對A對象進行讀寫的Controller
4、調用一次A對象的寫操作
5、調用多次A對象的讀操作
6、如果多次調用A對象的讀操作得到的結果都是第4步中寫的結果,那么證明注入的結果和單例模式得到的結果是一樣的,實驗成功,如果多次讀取操作得到的結果並不是第4步中寫的結果,那么理解有偏差。
實驗步驟:
1、編寫A對象:
package com.wyb.serviceimpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.wyb.dao.BookDao; import com.wyb.dao.UserMapper; import com.wyb.model.User; import com.wyb.service.UserService; @Service public class UseServiceImpl implements UserService { private String name; @Autowired private UserMapper userMapper; public User findUserById(int id) { User user = userMapper.selectByPrimaryKey(id); return user; } public String getName() { // TODO Auto-generated method stub return name; } public void setName(String name) { // TODO Auto-generated method stub this.name = name; } public String myToString(){ return "IocTest:"+super.toString()+",this.name="+this.name; } }
2、編寫A對象的讀寫操作Controller
@RequestMapping(value = "/list", method = RequestMethod.GET) @ResponseBody private String list(Model model,HttpServletRequest request) { String name = request.getParameter("name"); String result = null; if(!"".equals(name)&&name != null){ userService.setName(name); result = "success to set name,the value is: "+userService.getName(); }else{ result = userService.myToString(); } return result; }
3、運行程序,並按步驟調用讀寫操作。
3.1 寫操作
3.2 讀操作
實驗結論:
IOC的任務就是創建對象,創建的是公用對象,是單例對象,一次創建,到處使用。
個人覺得,在對象創建這一方面,ioc就是一個單例工具,作用是讓程序員不會再在Controller里面到處new Service對象,集中管理,統一分配,減少內存開銷。