【开发者笔记】揣摩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对象,集中管理,统一分配,减少内存开销。
【开发者笔记】揣摩Spring-ioc初探,ioc是不是单例?的更多相关文章
- Spring IOC(三)单例 bean 的注册管理
Spring IOC(三)单例 bean 的注册管理 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 在 Spring 中 ...
- spring的controller默认是单例还是多例
转: spring的controller默认是单例还是多例 先看看spring的bean作用域有几种,分别有啥不同. spring bean作用域有以下5个: singleton:单例模式,当spri ...
- 【Java面试宝典】说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的?
AOP与IOC的概念(即spring的核心) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度.而sprin ...
- Struts2 本是非单例的,与Spring集成就默认为单例
1.Struts2本身action类是多例,此设计的原因在于本身action担任了数据载体,如果做成单例,则会便多用户数据受到影响: 2.当Struts2 与 spring整合时,Struts2的Ac ...
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- spring中如何向一个单例bean中注入非单例bean
看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...
- spring静态工厂方法得到单例bean
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...
- Spring + Jedis集成Redis(单例redis数据库)
这几天没事,就把之前学习的redis代码整理一遍,废话不多说,上步骤. 1.pom.xml引入资源: <dependency> <groupId>org.springframe ...
- Java学习笔记(二十四):单例设计模式singleton
为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...
- filter和spring 的interceptor都是单例的,都不是线程安全的
Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.
随机推荐
- Linux 域名服务器配置
cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) 使用BIND构建DNS服务器 1.BIND服务器安装 yum install ...
- jquery的委托处理
1.基本用法: javascript的事件模型,采用”冒泡”模式,也就是说,子元素的事件会逐级向上”冒泡”,成为父元素的事件. 利用这一点,可以大大简化事件的绑定.比如,有一个表格(table元素) ...
- hadoop3.1.0 window win7 基础环境搭建
https://blog.csdn.net/wsh596823919/article/details/80774805 hadoop3.1.0 window win7 基础环境搭建 前言:在windo ...
- VS 清除编译产生的临时文件、文件夹
VS编译过程中会产生一些临时文件,通过以下脚本可清除 @echo off for /r %%i in (*.sdf,*.ncb,*.suo,*.exp,*.user,*.aps,*.idb,*.dep ...
- mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?
MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from tabl ...
- linux环境下,清空history中记录的历史命令
需求描述: 今天在数据库主机上操作,通过history看到有刚操作过的历史记录,想把这个清除了, 但是,还不影响后续的命令记录,所以查了下,在此记录. 操作过程: 1.通过history -c命令,完 ...
- Oracle中的三种循环(For、While、Loop)
from:http://jingyan.baidu.com/article/c275f6ba38036ae33c756773.html GOTO用法,以下是SQL源码: DECLARE x numb ...
- cocos2d-x 2.2 创建项目
楼主用的是2.2版本号 曾经的版本号是要在vs中加入模版 建立项目 但新版本号更新后使用python建立项目 最好是python2.7以上 找到create_project.py文件所在路径 too ...
- JBPM4.4_管理流程定义
1. 管理流程定义 没有更新功能 1.1. 部署流程定义 注意区分Deployment与ProcessDefinition 1.1.1. 示例代码1:流程定义有关文件在classpath中 Strin ...
- Cesium - 离线使用方法
使用Cesium可以直观的看基于DEM切片产生的Terrain地形数据,有种身临其境的感觉,但缺点是Cesium默认缺省加载了微软Bing提供的地形以及遥感影像数据,可以跟踪日志,总提示让你申请微软的 ...