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学习笔记的更多相关文章

  1. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  2. spring揭密学习笔记

    spring揭密学习笔记 spring揭密学习笔记(1) --spring的由来 spring揭密学习笔记(2)-spring ioc容器:IOC的基本概念

  3. Spring Boot学习笔记2——基本使用之最佳实践[z]

    前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...

  4. Spring.NET学习笔记——目录(原)

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

  5. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

  6. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  7. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  8. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  9. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  10. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

随机推荐

  1. maven常用命令(待补充)

    1.mvn clean 删除已经编译好的信息 2.mvn compile 编译src/main/java目录下的.java文件 3.mvn test 编译src/main/java和src/test/ ...

  2. 如何将java对象转换成json数据

    package cn.hopetesting.com.test;import cn.hopetesting.com.domain.User;import com.fasterxml.jackson.c ...

  3. ssm中的模糊查询

    1.首先是数据层接口协议 public List<User> looks(String uname); 2.数据层实现 <select id="looks" re ...

  4. VectorCAST - 通过确保测试的完整性控制产品质量

    软件测试面临的问题有一句格言是这样说的,"如果没有事先做好准备,就意味着做好了 失败的准备."如果把这个隐喻应用在软件测试方面,就可以这样说"没有测试到,就意味着测试失败 ...

  5. 【Linux】【CentOS7】免密登录突然失效

    [报错解决]免密登录突然失效 哔哩哔哩 萌狼蓝天 博客:萌狼工作室-博客园 [问题描述] 原本配置好了的免密登录,今天启动hadoop发现免密登录失效了 [解决方案] 1.切换到管理员模式,进入配置文 ...

  6. 【JavaWeb】【Eclipse】使用Eclipse创建我的第一个网页

    使用Eclipse创建我的第一个网页 哔哩哔哩 萌狼蓝天 你可以直接点击Finish,也可以点击Next,到下面这个界面后,勾选生成web.xml然后Finish(你不这样做就会没有Web.xml文件 ...

  7. Android CameraX ImageAnalysis 获取视频帧

    CameraX使用ImageAnalysis分析器,可以访问缓冲区中的图像,获取视频帧数据. 准备工作 准备工作包括gradle,layout,动态申请相机权限,外部存储权限等等,大部分设置与Came ...

  8. A New Discrete Particle Swarm Optimization Algorithm

    题目:一种新的离散粒子群优化算法 中文摘要 粒子群优化算法在许多优化问题上表现得非常好.粒子群优化算法的缺点之一是假设算法中的变量为连续变量.本文提出一个新的粒子群优化算法,能够优化离散变量.这个新算 ...

  9. CF1097B Petr and a Combination Lock 题解

    Content 有一个锁,它只有指针再次指到 \(0\) 刻度处才可以开锁(起始状态如图所示,一圈 \(360\) 度). 以下给出 \(n\) 个操作及每次转动度数,如果可以通过逆时针或顺时针再次转 ...

  10. CF177A1/A2 Good Matrix Elements 题解

    Content 给定一个 \(n\times n\) 的矩阵,每个元素都有一个值,求出处于两条对角线以及中间行和中间列的元素之和. 数据范围:\(1\leqslant n\leqslant 5(\te ...