前言:

  控制反转(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是不是单例?的更多相关文章

  1. Spring IOC(三)单例 bean 的注册管理

    Spring IOC(三)单例 bean 的注册管理 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 在 Spring 中 ...

  2. spring的controller默认是单例还是多例

    转: spring的controller默认是单例还是多例 先看看spring的bean作用域有几种,分别有啥不同. spring bean作用域有以下5个: singleton:单例模式,当spri ...

  3. 【Java面试宝典】说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理, aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的?

    AOP与IOC的概念(即spring的核心) IOC:Spring是开源框架,使用框架可以使我们减少工作量,提高工作效率并且它是分层结构,即相对应的层处理对应的业务逻辑,减少代码的耦合度.而sprin ...

  4. Struts2 本是非单例的,与Spring集成就默认为单例

    1.Struts2本身action类是多例,此设计的原因在于本身action担任了数据载体,如果做成单例,则会便多用户数据受到影响: 2.当Struts2 与 spring整合时,Struts2的Ac ...

  5. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  7. spring静态工厂方法得到单例bean

    import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...

  8. Spring + Jedis集成Redis(单例redis数据库)

    这几天没事,就把之前学习的redis代码整理一遍,废话不多说,上步骤. 1.pom.xml引入资源: <dependency> <groupId>org.springframe ...

  9. Java学习笔记(二十四):单例设计模式singleton

    为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...

  10. filter和spring 的interceptor都是单例的,都不是线程安全的

    Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.

随机推荐

  1. Eclipse的调试功能的10个小窍门

    你可能已经看过一些类似“关于调试的N件事”的文章了.但我想我每天大概在调试上会花掉1个小时,这是非常多的时间了.所以非常值得我们来了解一些用得到的功能,可以帮我们节约很多时间.所以在这个主题上值得我再 ...

  2. linux系统中RPM包的通用命名规则

    http://blog.csdn.net/kexiuyi/article/details/53292358

  3. 深入volley(三)自己来写volley

    https://github.com/Smalinuxer/android-SpillOver 这是我自己写的一个请求缓存框架,基于volley的,沿袭了volley的架构与设计思想,而对其进一步的封 ...

  4. Ext3.4-EXT之嵌套表格的实现

    其中使用到的"RowExpander.js"为extjs官方示例中自带的. 实现这个嵌套表格要注意两点技巧: 1 提供给外层表格的dataStore的数据源以嵌套数组的形式表示细节 ...

  5. 经典 MapReduce框架(MRv1)

    在 MapReduce 框架中,作业执行受两种类型的进程控制: 一个称为 JobTracker 的主要进程,它协调在集群上运行的所有作业,分配要在 TaskTracker 上运行的 map 和 red ...

  6. linux上如何快速删除一个目录

    在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决.直接rm就可以了,不过要加两个参数-rf 即:rm -rf   ...

  7. chmod 777 修改权限

    http://william71.blogbus.com/logs/33484772.html 在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限.例如我 ...

  8. Effective C++ —— 定制new和delete(八)

    STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...

  9. Spring启动过程分析】(1)启动流程简介

    1. spring简介 spring的最基本的功能就是创建对象及管理这些对象之间的依赖关系,实现低耦合.高内聚.还提供像通用日志记录.性能统计.安全控制.异常处理等面向切面的能力,还能帮我们管理最头疼 ...

  10. Windows下Mysql主从配置(Mysql5.5)

    主数据库IP:192.168.3.169从数据库IP:192.168.3.34 主数据库配置my.inin: 在[mysqld]下添加配置数据:server-id=1     #配一个唯一的ID编号, ...