重庆企业网站推广流程,福州做网站销售公司,兰州网络推广技术,成都住建局官网租房交易中心林纳斯托瓦兹#xff08;Linus Torvalds#xff09;说#xff1a;“我从心底认为#xff0c;优秀的程序员与平庸的程序员之间的区别#xff0c;是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码#xff0c;优秀的程序员则关注数据结构及之前的关…林纳斯·托瓦兹Linus Torvalds说“我从心底认为优秀的程序员与平庸的程序员之间的区别是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码优秀的程序员则关注数据结构及之前的关系。”
1、spring的设计理念
spring提供了一个轻量级的开发框架抽象了实际开发中的很多共性问题在javaee的开发中支持pojo和使用javabean的开发方式使应用面向接口开发、充分支持OO通过spring的ioc容器将复杂的对象耦合关系变成了一个文本化、外部化的工作通过一个或几个xml文件来方便的对应用对象的耦合关系进行维护、修改和浏览极大地简化了应用开发通过ioc容器的依赖反转将依赖关系从java对象中解放出来交给了ioc容器完成对象之间的关系进行了解耦对象——对象之间的关系转化成了对象——IOC容器——对象的关系IOC容器和AOP模块是spring最为基础的底层抽象IOC来管理bean对象aop以动态和非侵入的方式增强服务功能。
2、spring的整体架构
springioc、spring aop、springmvc、springjdbc/orm、spring事务处理、spring的远端调用、spring应用其中aop以纵向切面的方式贯穿在整个架构中
Spring 中两个数据结构最核心① BeanDefinition用于表示 Bean 的定义② BeanFactory用于表示整个 IoC 容器。
3、spring framework的核心IOC容器的实现
ioc容器概述
面向对象系统对象封装了数据和对数据的处理对象的依赖关系主要体现在对数据和方法的依赖上。这种依赖关系可以通过把对象的依赖注入交给框架或者IOC容器来完成依赖注入依赖对象获得被反转了由自身主动的获取反转到交给ioc容器来注入、获取。新建对象、对象的引用赋值等操作交由容器来统一完成。从而将散落在不同代码中的功能相同的部分集中成了容器的一部分成了面向对象基础设施的一部分。对面向对象系统中的对象分2类数据对象、处理数据的对象。后者不经常变化很少涉及数据和状态共享的问题是系统中基础的部分。同时这些对象间依赖关系也很稳定这些特性非常适合由ioc容器来进行管理
IOC容器的设计与实现
BeanFactory和ApplicationContext
我们通常说的ioc容器实际上指的是一些功能各异的容器产品各有特点
beanfactory容器的基本功能applicationcontext应用上下文作为容器的高级形态而存在增加了很多面向框架的特性和适配。
beandefinition抽象了对bean的定义管理各种对象是依赖翻转模式中管理的对象依赖关系的数据抽象是容器发挥作用的主要数据类型。计算机中所有的功能都是建立在通过数据对现实进行抽象的基础上的。
IOC容器的接口设计关系 1、从接口BeanFactory---HierarchicalBeanFactory---ConfigurableBeanFactory是一条主要的BeanFactory设计路径。
2、第二条接口设计主线是以ApplicationContext应用上下文接口为核心的接口设计从BeanFactory---ListableBeanFactory---ApplicationContext---WebApplicationContextConfigurableApplicationContext。
3、具体的IoC容器都是在以上的接口体系下实现的比如DefaultListableBeanFactory实现了ConfigurableBeanFactory从而成为一个简单IoC容器的实现。其他的如XmlBeanFactory都是在DefaultListableBeanFactory的基础上做扩展ApplicationContext也是如此。
4、BeanFactory是IoC容器最基本的接口提供的是最基本的IoC容器的功能比如getBean、containsBean等其他高级IoC容器接口再在此基础功能上进行扩展。
5、BeanFactory是一个对象工厂管理Spring中所有的Bean而FactoryBean是一个特殊的Bean。
IOC容器的创建步骤
1创建IoC配置文件的抽象资源包含了BeanDefinition的定义信息
2创建一个BeanFactory
3创建一个载入BeanDefinition的读取器
4从定义好的资源位置读入配置信息。 核心属性Spring 循环依赖 MapString, Object singletonObjects new ConcurrentHashMap(256)Bean 名称到单例 Bean 的映射用于存放完全初始化好的 Bean。可以理解成这就是所谓的容器。这是一级缓存。 MapString, Object earlySingletonObjects new HashMap(16)Bean 到“未成熟”单例 Bean 的映射。该 Bean 对象只是被创建出来但是还没有注入依赖。在容器解决循环依赖时用于存储中间状态。这是二级缓存。 MapString, ObjectFactory? singletonFactories new HashMap(16)Bean 名称到 Bean 的 ObjectFactory 对象的映射存放 Bean 工厂对象。在容器解决循环依赖时用于存储中间状态。这是三级缓存。
Bean 的获取过程就类似计算机缓存的作用过程先从一级获取失败再从二级、三级里面获取。org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean) 方法
实际中最长使用的是ApplicationContext这个高级形态的IOC容器。他除了具备基本的beanfactory的功能还集成了很多附加功能
支持信息源可以实现国际化。实现MessageSource接口访问资源。(实现ResourcePatternResolver接口这个后面要讲)支持应用事件。(实现ApplicationEventPublisher接口)在ApplicationContext中提供的附加服务
IOC容器初始化
refresh方法标志着ioc容器的正式启动。具体包括beandefinition的resources定位、载入和注册三个过程
IOC容器的初始化分为三个过程实现
第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。这个过程就是容器找数据的过程就像水桶装水需要先找到水一样。
第二个过程是BeanDefinition的载入过程。这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构而这个容器内部的数据结构就是BeanDefition。
第三个过程是向IOC容器注册这些BeanDefinition的过程这个过程就是将前面的BeanDefition保存到HashMap中的过程。
Spring容器创建之后会调用它的refresh方法refresh的时候会做很多事情比如完成配置类的解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。