Spring的IoC容器
IoC在程序开发中,实例的创建不再由调用者管理,而是由Spring容器创建。Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了Spring容器中,控制权发生了反转,这就是Spring的IoC思想
Spring基础就是IoC/DI容器
public class BeanFactory{
private static final Map<String,Object> map=new HashMap<>();
public static Object getBean(String id){}
}
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式解决方案) 轻量级开源框架
Spring的模块化结构
6个模块20多个子项目组成的,Spring的模块化是很强的,各个功能模块都是独立的,可以选择的使用
IoC(Inversion of Control):其思想是反转资源获取的方向
DI(Dependency Injection) — 即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源
注入. 相对于 IoC 而言,这种表述更直接
- bean是Spring管理的基本单位,在Spring的应用中,所有的组件都是bean,bean包括数据源、Hibernate的SessionFactory及事务管理器等。 Spring里的bean是非常广义的概念,任何的Java对象,Java组件都可被当成bean处理。甚至这些组件并不是标准的JavaBean。整个应用中各层的对象都处于 Spring 的管理下,这些对象以 bean 的方式存在,Spring负责创建 bean 实例,并管理其生命周期。
- bean在Spring容器中运行时,无须感受Spring容器的存在,一样可以接受Spring的依赖注入,包括bean属性的注入,合作者的注入及依赖关系的注入等
Spring优势
- 低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦。)
- 声明式事务管理
- 方便集成其他框架
- 降低JavaEE开发难度
- Spring框架中包括JavaEE 三层的每一层的解决方案 (一站式)
Spring功能
- Spring能帮我们根据配置文件创建及组装对象之间的依赖关系
- Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制
- Spring能非常简单的帮我们管理数据库事务
- Spring还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套 JDBC访问模板,来方便数据库访问
- Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC 框架,来方便web层搭建
- Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)
Spring的核心思想
- 不重复发明轮子理论
- 锤子理论
A a = new A1()然后通过a来调用接口的方法,对于C来说是主动实例化对象,直接获取依赖。
这种实现方法的缺点:
- 更换实现需要重新编译源代码
- 很难更换实现,很难测试
- 耦合实例生产者和实例消费者
工厂模式
设计模式属于创建型模式,它提供了一种创建对象的最佳方式
主要解决:主要解决接口实现的选择问题。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产
品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,
在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
工厂模式中产品可扩展,但是产品只能一种系列
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他
工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
主要解决:提供一个创建一系列相关或相互依赖对象的接口,解决接口实现选择的问题
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
功能扩展
产品的系列不可扩展,引入资源文件,使用反射创建字串所指代的对象。
但是properties文件在IDE中缺乏语法检查,所以考虑采用xml作为配置
Spring的工厂模式实现
Spring框架最重要是提供了以类似上面xml+BeanFactory的方式管理配置在xml文件中的受管Bean
XML配置
XML可扩展标记语言,是一种依靠与SGML由w3c定义出来的标记语言。XML允许用户自定义标签,提供
了2种方式说明其中的标签: dtd[ 文档类型定义]或者xsd(模式类型定义)。
Xml文件可以分为无效、良构和有效的3种,一般对xml文件的解析至少要求良构的。
XML文件作用
- 存储数据
- 传递数据,即服务器以XML的形式传输数据
- 软件配置,即通过配置XML文件,通知应用程序如何处理业务
XML和Html的关系
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
- XML 被设计用来传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML文件的解析模型
DOM
DOM是W3C处理XML的标准API,它是许多其它与XML处理相关的标准的基础,不仅是Java,其它诸如
Javascript,PHP,MS .NET 等等语言都实现了该标准, 成为了应用最为广泛的XML处理方式
- 形成树结构,直观好理解
- 解析过程中树结构保留在内存中,方便修改
- 当xml文件较大时,对内存消耗比较大,容易影响解析性能并造成内存溢出
- 适用范围:小型XML文件解析、需要全解析或者大部分解析XML、需要修改XML树内容以生成自己 的对象模型
SAX
SAX使用了最少的系统资源和最快速的解析方式对XML处理提供了支持。 但随之而来繁琐的查找方式也给广大程序员带来许多困扰,常常令人头痛不已
- 采用事件驱动模式,对内存消耗比较小
- 适用于只需要处理xml中数据时
- 不易编码
- 很难同时访问同一个xml文件中的多处不同位置
适用范围:大型XML文件解析、只需要部分解析或者只想取得部分XML树内容、有XPath查询需求、有自己生成特定XML树对象模型的需求
Spring基本框架结构
Spring是一种JavaEE开发中的一站式解决方案,所以其中包含的内容比较多,为了避免在应用中添加无
用功能,所以Spring采用了非强制性的模块化结构,在具体应用中,可以根据应用所需要的功能进行选
择添加
Spring3.x分为6大模块,Spring的模块化是很强的,各个功能模块都是独立的,可以选择的使用
- Core模块是Spring应用的基础,提供了最基本的IoC/DI容器的支持和实现
- AOP模块建立在Core模块的基础上,提供了AOP技术的支持,以简化AOP编程的复杂度
- DAO和ORM模块建立在AOP的基础上,DAO提供了dao模式编程的简化支持,ORM提供了整合持久层框架的支持。同时在AOP的基础上给数据库访问提供了声明式事务的支持
- JEE模块建立在Core模块的基础上,提供了针对EJB\邮件javaMail等企业级应用支持
- Web模块建立在core模块的基础上,提供了整合其它表现层框架【例如Struts\JSF等】的支持,同时提出了自己的表现层框架SpringMVC[针对Struts1提出的]
Spring4.x分为6大模块,包括20多个子项目
- Core container核心容器:beans core context context-support expression
- AOP和apects提供AOP编程技术支持: aop aspects,另外还有其它的不是Spring的jar
- Data Access/Integration针对DAO编程和ORM整合的支持: jdbc orm tx
- Web提供了整合表现层框架和对应的web解决方案SpringMVC:web webmvc
- Instrumentation底层基础,是一种没有图形界面的,具有启动能力的,用于监控其他类的工具类
- Test提供了单元测试的支持,要求junit4.8+版本