【開發者筆記】揣摩Spring-ioc初探,ioc是不是單例?


前言:

  控制反轉(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對象,集中管理,統一分配,減少內存開銷。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM