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的都是包装类。
推荐阅读
-
cpu中一级缓存是什么及数据缓存设计介绍
-
iC3D Suite(三维包装设计软件)如何激活 iC3D Suite安装及激活教程
-
JavaScript设计模式精华摘抄(持续更新...)-考拉阅读前端团队-SegmentFault思否
-
《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
-
js 设计模式——状态模式
-
Java设计中的Builder模式的介绍
-
c#设计模式之单例模式的实现方式
-
23种GoF设计模式概述
-
React组件设计模式之组合组件应用实例分析
-
Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring