1 Spring概述
1.1 什么是Spring?
Spring是一个轻量级Java开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(全栈-一站式)轻量级开源框架,为开发Java应用程序提供全面的基础框架支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
Spring可以做很多事情,它为企业级开发提供了很多丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,依赖注入(dependency injection,DI)和面向切面编程(aspect-orientedprogramming,AOP)
为了降低Java开发的复杂性,Spring采取了一下四种策略:
- 基于pojo的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
1.2 Spring框架的设计目标
- 为开发者提供一个一站式轻量级应用开发平台。
1.3 Spring框架的设计理念
- 在JavaEE开发中,支持pojo和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)的设计方法;Spring通过IoC(控制反转)容器实现对 对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦。
1.4 Spring框架的核心功能
- IoC容器和AOP模块。
- 通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入式的方式增强服务。
- IoC容器让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
1.5 Spring的优缺点是什么?
优点:
- 方便解耦,简化开发
Spring是一个大工厂,可以将所欲对象的创建和对依赖关系的维护,统一交给Sring管理。
- AOP编程的支持
Spring提供面向切面的编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
- 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。
- 方便程序的测试
Spring支持Junit4,可以通过注解方便的测试Spring程序。
- 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Structs、Hibernate、MyBatis等)
- 降低JavaEE API的使用难度
Spring对JavaEE开发中一些非常难操作的API(如:JDBC、JavaMail、远程调用等),都提供了封装,是这些API应用难度大大降低。
缺点
- Spring依赖反射机制,反射影响程序性能;
- 使用门槛高,入门Spring需要较长时间;
- 中断了应用程序的逻辑,使代码变得不完整,不直观。此时单从Source无法完全把握应用的所有行为;
- 将原本应该代码化的逻辑配置化了,增加了出错的机会,以及额外的负担;
- 调试阶段不直观,后期的bug对应阶段,不容易判断问题所在。
1.6 Spring有哪些应用场景
应用场景:JavaEE企业级应用开发,包括SSH、SSM(主流)。
Spring价值:
- Spring是非侵入式的框架,目标是使应用程序代码对框架依赖最小化;
- Spring提供一个一致的编程模型,使应用直接使用POJO开发,与运行环境隔离开来;
- Spring推动应用设计风格面向对象和面向接口开发的转变,提高了代码的重用性和可测试性。
1.7 Spring七大模块(统分结构)
详解:
1.7.1 核心容器(Spring Core)
- 1 是Spring的核心容器,提供了Spring框架的基本功能;
- 2 此模块包含的BeanFactory类是Spring的核心类,负责生产和管理Bean,Spring将管理对象称为Bean,是工厂模式的实现;
- 3 采用Factory(工厂模式)实现了IoC(控制反转)将应用的配置和依赖性规范与实际的应用程序代码分开;
- Spring以Bean的方式组织和管理Java应用中开发各个组件及其之间的关系。
1.7.2 应用程序上下文(Spring Context)
- 1 是一个配置文件,向Spring框架提供上下文信息;
- 2 SpringContext模块继承BeanFactory类,添加了时间处理、国际化、资源装载、透明装载、以及数据校验等功能;
- 3 还提供了框架式的Bean的访问方式和企业级的功能,如JNDI访问(Java 命名与目录接口Java Naming and Directory Interface),支持EJB(Enterprise Java Bean)、远程调用、继承模块框架、Email和定时任务调度等。
1.7.3 面向切面编程(Spring AOP)
- 1 Spring AOP直接将面向切面的编程功能集成到了Spring框架中,所以很容易的使Spring框架管理的任何对象支持AOP(Spring集成了所有AOP功能,通过事务管理可以使任意Spring管理的对象AOP化);
- 2 Spring AOP为基于Spring的应用程序中的对象提供了事务管理的服务;
- 3 通过使用Spring AOP,可以不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
1.7.4 JDBC和DAO模块(Spring DAO)
- 1 DAO(Data Access Object):模式思想是将业务逻辑代码与数据库交互代码分离,降低两者耦合;
- 2 通过DAO模式可以将结构变得更加清晰,代码更为简化;
- 3 DAO模块中的JDBC抽象层,提供了有意义的异常层次结构,用该结构来管理异常处理和不同数据库提供商所抛出的错误信息;
- 4 异常层次结构简化了数据库厂商的异常错误(不再从SQLException继承大批代码),极大的降低了需要编写的代码数量,并且提供了对声明式事务和编程式事务的支持。
1.7.5 对象实体映射(Spring ORM)
- 1 Spring ORM模块提供了对现有ORM框架的支持;
- 2 提供了ORM对象的关系工具,其中包括了Hibernate、JDO和iBatis、SQL、Map等,所有的这些都遵从Spring的通用事务和DAO异常层次结构;
- 3 注意这里Spring是提供各类的接口(support),目前比较流行的下层数据库封闭映射框架,如iBatis、Hibernate等。
1.7.6 Web模块(Spring Web)
- 1 此模块建立在SpringContext基础上,提供了Servlet监听器的Context和Web应用的上下文;
- 2 对现有的Web框架,如JSF、Tapestry、Structs等提供了集成;
- 3 SpringWeb模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
1.7.7 MVC模块(Spring Web MVC)
- 1 Spring Web MVC模块建立在Spring核心功能之上,拥有Spring框架的所有特性,能够适应多种多视图、模板技术、国际化和严重服务,实现控制逻辑和业务逻辑的清晰分离;
- 2 通过策略接口,MVC框架变成高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI;
- MVC模型:
- 1 Servlet控制器为应用程序提供了一个进行前-后端处理的中枢。一方面为输入数据的验证、身份验证、日志及实现国际化编程提供了一个合适的切入点;另外一方面也提供了将业务逻辑从JSP文件剥离的可能。
- 2 业务逻辑从JSP页面分离后,JSP页面蜕变成一个单纯完成显示任务的东西,这就是常说的View;
- 3 而独立出来的业务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC模式。
1.8 Spring模块(体系结构)
- Spring Core:
提供了框架的基本组成部分包括控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)功能。
- Spring Beans:
提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。
- Spring Context:
上下文,构建与core封装包基础上的context封装包,提供了一种框架式的对象访问方法。
- Spring JDBC:
提供了一个JDBC的抽象层,消除了繁琐的JDBC编码和数据库厂商特有的错误代码解析,用于简化JDBC。
- Spring AOP:
提供了面向切面的编程实现,用户可以自定义拦截器、切点等。
- Spring Web:
提供了针对Web开发的集成特性,例如文件上传,利用Servlet Listeners
进行IoC容器初始化和针对Web的ApplicationContext。 - Spring Text:
主要是为测试提供支持的,支持使用Junit4或TestNG对Spring组件进行单元测试和集成测试。
1.9 Spring框架中都用到了哪些设计模式?
- 1 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
- 2 单例模式:Bean默认为单例模式;
- 3 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
- 4 模板方法:用来解决代码重复的问题。比如:RestTemplate,JmsTemplate, JpaTemplate;
- 5 观察者模式:定义对象键,一种一对多的依赖关系,当当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中Listener的实现ApplicationListener。
1.10 Spring应用程序有哪些不同的组件?
Spring应用一般有以下组件:
- 接口:定义功能;
- Bean类:包含属性,setter和getter方法,函数等;
- Bean配置文件:包含类的信息以及如何配置信息;
- Spring面向切面编程(AOP):提供面向切面编程的功能;
- 用户程序:使用接口。
1.11 使用Spring有哪些方式?
- 作为一个成熟的Spring Web应用程序;
- 作为第三方Web框架,使用Spring Frameworks中间层;
- 作为企业级Java Bean,他可以包装现有的POJO(Plain Old Java Objects);
- 用于远程使用。