springIOC及设计模式
一.IOC的概念:
控制反转(inversion of control)和依赖注入(dependency injection)其实是同一个概念。当某个方法需要另外一个对象协助的时候,传统的方法就是有调用者来通过new创建被调用者的实例,但是在spring中创建被调用者的工作不再有调用者来完成,称之为控制反转(ioc)。创建被调用者的工作由spring来完成,然后注入调用者,成为依赖注入。
这样做得目的当然是为了解耦,减低类之间得耦合度,其设计思想就是设计模式中得工厂模式。在spring容器启动得时候,spring会将配置项中配置好得bean都初始化。需要调用得时候,把初始化得bean分配给调用的类,而不需要手动创建一个对象实例。
对于springIOC来说由两处地方最重要,一个是创建bean容器,一个是初始化bean。
二.SpringIOC的顶层接口:

在Sping IoC的体系结构中BeanFactory作为最顶层的一个接口类,它定义了IoC容器的基本功能规范。并且为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问做限制,使用了多层接口ListableBeanFactory 接口表示这些 Bean 是可列表的. HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。
默认实现类是 DefaultListableBeanFactory,他实现了所有的接口.
本来准备自己写源码分析的,但是在网上找到一个更好的更详细的,(个人感觉我是写不出来那么好的博客),建议去看那篇博客:
https://blog.csdn.net/nuomizhende45/article/details/81158383
-------------------------------------------------------spring设计模式-----------------------------------------------
在springIOC中用到的设计模式有四种:工厂模式,单例模式,策略模式,装饰者模式。
一.工厂模式
Spring IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。IOC 容器负责创建对象,将对象连接在一起,配置这些对象,并从创建中处理这些对象的整个生命周期(多例的对象spring不会管理生命周期),直到它们被完全销毁。
Spring使用工厂模式可以通过BeanFactory或者ApplicationContext创建bean对象。
BeanFactory:延迟注入(spring默认为懒加载,即使用到某个bean的时候才会注入,可以通过@Lazy(false)设置为非懒加载)。相比于ApplicationContext来说会占用更少的内存。
ApplicationContext:容器启动的时候,不管有没有用到,一次性创建所有的bean,ApplicationContext继承了BeanFactory,除了BeanFactory的功能外还有额外的更多功能,所以一般使用的更多。
二.单例模式
Spring 中 bean 的默认作用域就是 singleton(单例)的。Spring中实现单例的方式有两种:
xml : <bean id="userService" class="top.snailclimb.UserService" scope="singleton"/> 注解:@Scope(value = "singleton")
除了singleton作用域,Spring中bean还有下面几种作用域:
prototype : 每次请求都会创建一个新的 bean 实例。
request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
三. 策略模式
在spring中通过ApplicationContext 来获取Resource的实例,包括urlResource,classPathResource,fileSystenResource等不同的资源类型,spring针对不同的资源类型采取不同的访问策略。ApplicationContext 将会负责选择 Resource 的实现类,也就是确定具体的资源访问策略,从而将应用程序和具体的资源访问策略分离开来。
四. 装饰者模式
装饰者模式可以动态地给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。简单点儿说就是当我们需要修改原有的功能,但我们又不愿直接去修改原有的代码时,设计一个Decorator套在原有代码外面。其实在 JDK 中就有很多地方用到了装饰者模式,比如 InputStream家族,InputStream 类下有 FileInputStream (读取文件)、BufferedInputStream (增加缓存,使读取文件速度大大提升)等子类都在不修改InputStream 代码的情况下扩展了它的功能。
Spring中类中带有Wrapper的都是包装类。
springIOC及设计模式的更多相关文章
- SpringIOC和AOP原理 设计模式
SpringIOC的特点 在接触Spring的过程中,听到最多的无非两个名词,一个是控制反转一个是依赖注入.实际这是一个意思,控制反转代表原来由程序本身去控制对象之间的依赖关系的这种格局被反转了,通过 ...
- 设计模式(十四)——模板模式(SpringIOC源码分析)
1 豆浆制作问题 编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3 ...
- java设计模式之工厂方法探究
简单工厂 + 工厂方法 + 抽象工厂 看了十几篇博客,每篇基本上都能有个自己的解释,我汇总这些内容,重新梳理整理了一番,以形成自己的理解. 简单工厂模式其实不算23种设计模式之 ...
- 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- Spring知识点总结(四)之SpringAOP基础 - 代理设计模式
1. 分析程序中存在的问题(高内聚,低耦合) 通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...
- Java设计模式:23种设计模式全面解析(超级详细)以及在源码中的应用
从网络上找的设计模式, 很全面,只要把UML类图看懂了, 照着类图将代码实现是很容易的事情. 步骤: 先看懂类图, 然后将代码实现, 之后再看文字 http://c.biancheng.net/des ...
- 【设计模式】Java设计模式 - 反射机制
[设计模式]Java设计模式 - 反射机制 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 反射 ...
- 23种设计模式之自定义Spring框架(五)
7,自定义Spring框架 7.1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟. 数据访问层.定义UserDao ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
随机推荐
- 2019-9-25:渗透测试,基础学习,medusa爆破学习
Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...
- 【IntelliJ IDEA】IDEA自动生成serialVersionUID的办法
digest:实体对象实现了java.io.Serializable接口后,一般都会提供一个serialVersionUID一做版本区分.在IDEA里,可以通过一些设置,帮助我们快速生成serialV ...
- oracle查询练习
1成绩表score如下,查询出每门课都大于80分的学生姓名 准备数据 -建表- SQL> create table score( 2 name varchar(50), 3 kech ...
- appium自动化的一个实例
实现appium的自动化,三步走,具体如下: 第一步:启动appium的服务端: 可以通过命令行的方式启动:cmd,然后输入appium,如下图 也可以打开桌面程序appium,点击右上角的运行按钮, ...
- PHP的array_walk和array_map函数实现数组值UTF-8转GBK编码
在PHP中,array_walk() 和 array_map()两个函数都可以实现对数组中每个值的修改,比如本例就是将数组中所有的值,由UTF-8编码转成GBK编码. 当然,除了这两个函数,也可以用 ...
- css练习——两列左窄右kuan型
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Python正则表达式,看完这篇文章就够了...#华为云·寻找黑马程序员#【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 搞清楚一道关于Integer的面试题
请看题1: public class IntegerDemo { public static void main(String[] args) { Integer a = 888; Integer b ...
- 转:Spring Boot中使用AOP统一处理Web请求日志
在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...
- use dict in bash
declare -A animals=(["moo"]="cow" ["woof"]="dog") for sound ...