spring-Ioc学习笔记
spring 是面向Bean的编程
- Ioc (Inversion of Control) 控制反转/依赖注入(DI:Dependency Injection)
- Aop(Aspect Oriented Programming) 面向切面编程
spring框架概述
Bean的作用域
默认情况下为单例模式:scope="singleton"
<bean id ="user" class="entity.User"/>
<bean is = "user" class= "entity.User" scope="singleton"/>
类别 | 说明 |
---|---|
singleton(单例) | 在spring容器中仅存在一个共享的Bean实例 |
prototype(原型) | 每次从容器中都是获取一个新的实例 |
request | 每次请求都会创建一个新的Bean实例 |
session | 同一个HTTP请求共享一个Bean实例 |
global Session | 同一个全局Session共享一个Bean实例 |
注:request,session, global session模式,仅适用于WebApplicationContext环境
spring Bean封装机制
- Spring 以Bean的方式管理所有的组件,java EE 的全部组件都是被视为Bean管理
- Bean 在Spring 的容器中运行,Spring负责创建Bean的实例,并管理其生命同期
BeanFactory
- 由org.springframework.beans.factory.BeanFactory接口定义
- BeanFactory 是工厂模式(Factory pattern)的实现,负责创建和管理bean
ApplicationContext 是BeanFactory的子接口
- 实现类 ClassPathXmlApplicationContext(用于查找根目录下的配置文件)
- 实现类 FileSystemXmlApplicationContext(用于查找系统盘下的配置文件)
- 当我们有多个配置文件时
ApplicationContext context = new ClassPathXmlApplication(new String[]{
"conf/bean1.xml", "conf/bean2.xml"
})
控制反转/依赖注入
- 将组件对象的控制权从代码本身转移到外部容器
- 组件化的思想:分离关注点,接口与实现分离
- 依赖的注入:将组件的构建和使用分开
Ioc使用两大关键技术一个设计模式
- JDOM: 用于解析配置文件
- 反射机制
- 工厂模式(单例模式)
spring Ioc原理解析
- 导入所需要的所需要的jar包
- 创建接口ITestDao
- 分别创建两个实现类TestDao 和NewDao
- 创建业务类TestBiz,当我们需要调用ITestDao时,必须new一个实例
耦合 - 当直接new 一个实例时,代码就高度耦合,那么怎么解耦合呢,这里引入工厂模式,我们创建一个工厂类,把new 实例的权利交给工厂,我们直接和工厂要就行
- 业务层通过工厂得到一个ITestDao的实例
- 这样数据层和业务层就实现了解耦合
那么spring是怎么实现解耦合的呢,接下来我们接着修改
- 修改业务层,使之面向接口的实现
- 创建接口ITestBiz
- 修改TestBiz类
- 实现ITestBiz接口
- 声明dao层接口的属性,并提供getter/setter方法
- 编写spring的配置文件,applicationContext.xml
- 导入schema文件
- 在spring配置文件里声明需要spring管理的Bean,就是创建一个对象
- 创建测试类TestIoc
- 如果我们现在通过new TestBiz类,会得到什么?
- 运行main方法
- 报错空指针异常
- 那么,应该怎么做呢?当我们把bean交给spring容器管理后,我们应该向spring索要需要的bean
- 首先,把配置文件applicationContext.xml读取进来
- 通过 getBean()方法得到所需要的实例,传入配置文件声明的bean的id
- 运行main方法
- 实现过程,通过getBean()传入的参数testBiz找到 -----> 配置文件中的id为testBiz的bean组件-----》实例化对象(new TestBiz())---->在TestBiz类中有一个dao的属性------>调用setData()方法给dao属性初始化(testBiz.setDao(testDao))----->通过引用的testDao找到id为testDao的bean ---->实例化一个TestDao对象(new TestDao())
- 当我们需求变更时,我们直接在配置文件中替换组件就行,例如我们想要NewDao的实例
- 直接运行main方法,看看输出了什么?
- 输出了NewDao中的数据
总结:spring 扮演了一个工厂的角色,所有的类都是一个组件,一个bean
默认情况下spring 只会创建一个对象,所有的调用者共享一个实例,我们来验证一下
- 我们来再一次调用getBean()方法,赋值给新的变量,我们来判断两个变量的内存地址是否相等
- 结果为true ,我们在配置文件中把bean 的作用域修改为prototype
- 接着我们来再次运行
- 结果为false
spring 在启动时会把所有的作用域为单例的bean都进行实例化
这时我们看到testDao在spring初始化之前就实例化,而testBiz是spring初始化后实例化的。当我们把配置文件中的作用域修改成单例模式后
运行程序查看结果
testBiz在spring初始化之前完成了实例化
spring-Ioc学习笔记的更多相关文章
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- spring揭密学习笔记
spring揭密学习笔记 spring揭密学习笔记(1) --spring的由来 spring揭密学习笔记(2)-spring ioc容器:IOC的基本概念
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring.NET学习笔记——目录(原)
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- Spring框架学习笔记(1)
Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...
- Spring MVC 学习笔记一 HelloWorld
Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...
- SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...
- SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证
整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
随机推荐
- MySQL5.7安装教程(亲测有效)
跟着狂神学java到了数据库阶段了,首先得安装好数据库啊,这里用的是MySQL 压缩包下载:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5. ...
- Quartz在.NET中的使用
一.背景 例如需要在某年某月去将数据库的某个数据更新或者同步,又或者是每隔一段时间来执行一部分代码去调用接口,但是又不想人为的手动去执行 针对此类业务可以使用"定时调用任务",市面 ...
- 测试工具_siage
目录 一.简介 二.例子 三.参数 一.简介 Siege是一个多线程http负载测试和基准测试工具. 1.他可以查看每一个链接的状态和发送字节数 2.可以模拟不同用户进行访问 3.可以使用POST方法 ...
- Docker从入门到精通(四)——常用命令
话不多说,本篇文章给大家介绍 docker 的常用命令,基本上会覆盖我们日常使用的命令. 1.万能帮助命令 docker 命令 --help 假设你想用某个命令,但是又不知道该命令的一些参数怎么用,这 ...
- typescript接口---interface
假如我现在需要批量生产一批对象,这些对象有相同的属性,并且对应属性值的数据类型一致.该怎么去做? 在ts中,因为要检验数据类型,所以必须对每个变量进行规范,自然也提供了一种批量规范的功能.这个功能就是 ...
- 『学了就忘』Linux系统管理 — 83、Linux中进程的查看(top命令)
目录 1.top命令介绍 2.top命令示例 3.top命令输出项解释 4.top命令常用的实例 1.top命令介绍 top命令是用来动态显示系统中进程的命令. [root@localhost ~]# ...
- 使用.NET 6开发TodoList应用(4)——引入数据存储
需求 作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件.对我们的TodoList项目来说,自然也需要配置数据存储.目前的需求很简单: 需要能持久化TodoList对象并对其 ...
- 如何高效地把Spring boot学到能干活的程度
Spring boot要学什么?要学到什么程度?以及相关的学习方法是什么?这些很难量化,但极好形容:需要学到能帮你找到一份工作的程度. 任何脱离工作脱离实际的学习,都是没有意义的.比如程序员运行通 ...
- 对ORM的理解
1. 在面试中可能会问到这个问题,什么是ORM? ORM是对象关系映射(Object Relational Mapping),简称ORM,或O/RM,或O/R mapping,是一种程序技术. 白话理 ...
- CF1440A Buy the String 题解
Content 有 \(t\) 组询问,每组询问给出一个长度为 \(n\) 的 \(0/1\) 串,你可以花 \(h\) 的代价把 \(0\) 修改成 \(1\) 或者把 \(1\) 修改成 \(0\ ...