【开发者笔记】揣摩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 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.
随机推荐
- Unity 如何高效的解析数据
昨天和朋友聊天时,他遇到这么一个问题:现在有按照一定格式的数据,例如:#code==text 此处是注释100==确定101==取消key==value 这么个格式的,说白了就是怎样解析这些固定格式字 ...
- UGUI之Canvas Group
可以通过Canvas Group影响该组UI元素的部分性质,而不需要费力的对该组UI下的每个元素逐个调整.Canvas Group是同时作用于该组UI下的全部元素. 参数:Alpha:该组UI元素的透 ...
- linux中sftp默认登录的端口号是多少? sftp通过指定的端口号连接?sftp默认端口号
需求描述: 今天一个同事,遇到个问题,程序连接sftp服务器连接不上,问我端口号是多少, 我想了一下是21还是22,所以就做了测试,发现sftp默认的连接端口号是22, 在此做下记录. 操作过程: 1 ...
- consul读取key value
1.nuget 搜索consul安装 2. using (var client = new ConsulClient()) { var kvPair = client.KV.Get(key).Resu ...
- 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>
1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态 ...
- python文件和目录操作方法大全(含实例)【python】
转自:http://www.jb51.net/article/48001.htm 一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 1.得到当前工作目录,即当前Py ...
- round()
round() 用于对一个数值进行四舍五入,如果接收两个参数,则第二个参数表示保留多少位小数 In [1]: round(1.5324) Out[1]: 2.0 In [2]: round(1.532 ...
- 关于ARM的内核架构
很多时候我们都会对M0,M0+,M3,M4,M7,arm7,arm9,CORTEX-A系列,或者说AVR,51,PIC等,一头雾水,只知道是架构,不知道具体是什么,有哪些不同?今天查了些资料,来解解惑 ...
- 使用Node.js完成路由
首先先看一下文件的结构: 我想通过改变不同的路由进不同的页面, 先看这几个HTML页面: 404: <!DOCTYPE html> <html lang="en" ...
- Swift 高级运算符
本文转载至 http://my.oschina.net/sunqichao/blog?disp=2&catalog=0&sort=time&p=2 除了基本操作符中所讲的运算符 ...