前言:
控制反转(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对象,集中管理,统一分配,减少内存开销。