第一章 Spring的概述
Spring的基本介绍
Spring:春天(给软件行业带来了春天)
作者:Rod Johnson
设计理念:Spring是面向Bean的编程。
Spring的历史
Spring 1.x时期(2002年-2006年)
① 2002,首次推出了Spring框架的雏形(它提供了IOC容器和AOP框架两个核心功能),interface21框架!
② Spring框架即以inteface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。
Spring 2.x时期(2006年-2009年)
① 2006年发布的Spring 2.0版本是一个里程碑式的版本,它引入了很多新的功能,如注解驱动的开发模式、Spring MVC框架、JDBC模板等。
此时,Spring框架已经成为Java应用程序开发的事实标准。
Spring 3.x时期(2009年-2013年)
① 2010年发布的Spring 3.0版本进一步加强了Spring框架的功能和性能,引入了Java 5的特性支持、REST风格的Web服务支持等,Spring框架的模块化设计也得到了进一步优化,使得开发人员可以更加灵活地使用框架的各个组件。
Spring 4.x时期(2013年-2018年)
① 2013年发布的Spring 4.0版本进一步强化了Spring框架的性能和功能,支持Java 8的新特性,引入了WebSocket支持等。
Spring Boot也在这个阶段被引入,它是Spring框架的一个子项目,可以帮助开发人员更加轻松地构建Spring应用程序。
Spring 5.x时期(2018年至今)
① 2017年发布的Spring 5.0版本引入了对响应式编程的支持,并且对Spring框架的核心组件进行了重构和升级,以提高框架的性能和可扩展性。
Spring boot构建一切
Spring cloud协调一切
Spring Data Flow连接一切
优点和缺点
优点
① 低侵入式设计
② 独立于各种应用服务器
③ 依赖注入特性将组件关系透明化,降低了耦合度
④ 面向切面编程特性允许将通用任gl务进行集中式处理
⑤ 与第三方框架的良好整合
缺点
弊端:发展了太久,违背了原来的理念!配置十分繁琐,人称“配置地狱”。
Spring的体系结构
名称 | 说明 |
---|---|
核心容器(Core Container) | |
数据访问/集成(Data Access/Integration)层 | |
Web层 | |
AOP(Aspect Oriented Programming)模块 | |
仪表(Instrumentation)模块 | |
消息传输(Messaging) | |
测试(Test)模块 |
Spring的组成
名称 | 说明 |
---|---|
Spring Core(核心容器) | ①、核心容器提供 Spring 框架的基本功能(Spring Core) ②、核心容器的主要组件是 BeanFactory,它是工厂模式的实现。③、BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 |
SpringContext(Spring 上下文) | Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 |
Spring AOP | 通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 |
Spring DAO | JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 |
Spring ORM | 负责框架中对象关系映射,提供相关ORM 接入框架的关系对象管理工具 。Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 |
Spring Web 模块 | Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 |
Spring MVC 框架 | MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用。 |
两大核心技术(IOC和AOP)
① 控制反转(IOC:inversion of Control)/依赖注入(DI:Dependency injection)。
② 面向切面编程(AOP:Aspect Oriented Programming)。
组件化的思想:分离关注点,使用接口,不再关注实现。
依赖注入:将组件的构建和使用分开。
依赖注入(Dependency Injection ,DI)
说明:Spring容器负责将被依赖对象赋值给调用者的成员变量,为调用者注入了它依赖的实例。
实现方式
① 属性setter方法注入
// 被注入类编写属性的setter方法
public void setStudentDao(StudentDao studentDao){
this.studentDao = studentDao;
}
// 配置文件中,给需要注入属性值的 <bean> 中设置 <property>
<bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"> </bean>
<bean id="studentService" class="com.itbaizhan.service.StudentService">
<!--依赖注入-->
<!--name:对象的属性名 ref:容器中对象的id值-->
<property name="studentDao" ref="studentDao"></property>
</bean>
② 构造方法注入
// 被注入类编写有参的构造方法
public StudentService(StudentDao studentDao){
this.studentDao = studentDao;
}
// 给需要注入属性值的 <bean> 中设置 <constructor-arg>
<bean id="studentDao" class="com.itbaizhan.dao.StudentDaoImpl"></bean>
<bean id="studentService" class="com.itbaizhan.service.StudentService">
<!-- 依赖注入 -->
<!-- name:对象的属性名 ref:配置文件中注入对象的id值 -->
<constructor-arg name="studentDao" ref="studentDao"></constructor-arg>
</bean>
③ 自动注入
// 自动注入不需要在 <bean> 标签中添加其他标签注入属性值,而是自动从容器中找到相应的bean对象设置为属性值。
自动注入有两种配置方式:
// 全局配置:在 <beans> 中设置 default-autowire 属性可以定义所有bean对象的自动注入策略。
// 局部配置:在 <bean> 中设置 autowire 属性可以定义当前bean对象的自动注入策略。
autowire的取值如下:
// no:不会进行自动注入。
// default:全局配置default相当于no,局部配置default表示使用全局配置
// byName:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供set方法。
// byType:在Spring容器中查找类型与属性类型相同的bean,并进行注入。需要提供set方法。
// constructor:在Spring容器中查找id与属性名相同的bean,并进行注入。需要提供构造方法。
控制反转(IOC)
说明:控制权(创建对象,控制程序关系)发生了反转。
传统模式:当某个java对象需要调用另一个Java对象时,会使用new 被调用者。
缺点:这种导致调用者和被调用者的耦合性增加,不利于后期项目的升级和维护。
Bean的作用域(7)
作用域 | 说明 |
---|---|
singleton(单例) | 1、只有一个实例(默认定义域)。2、使用范围:Dao组件、service组件。 |
prototype(原型) | 每次创建一个新的实例 |
request | 同一次的HTTP请求,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean(有效期:当HTTP request内有效) |
globalSession | 在一个全局的HTTP Session中,容器会返回该该Bean的同一实例。(仅在使用portlet上下文时有效) |
application | 为每个ServletContext对象创建一个实例(仅在Web相关的ApplicationContext中生效) |
websocket | 为每个Websocket对象创建一个实例。仅在Web相关的ApplicationContext有效 |
Bean的声明周期
两个单词:postinitiation初始化后、predestruction销毁前
Spring管理生命周期
作用域 | 与生命周期的关系 |
---|---|
singleton | Spring能够精确的知道的Bean何时被创建,何时初始化完成以及何时销毁 |
prototype | Spring只负责创建,剩下的交给客户端代码来管理 |
Bean的生命周期的整个过程
① 构造方法/工厂方法实例化。
② 利用依赖注入完成Bean中所有属性值的配置注入。
Ⅰ 实现了BeanNameAware接口 → Spring调Bean的setBeanName()传入当前Bean的id值。
Ⅱ 实现了BeanFactoryAware接口 → Spring调用setBeanFactory()方法传入当前工厂实例的引用。
Ⅲ 实现了ApplicationContextAware接口 → Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
Ⅳ BeanPostProcessor和Bean关联 → Spring将调用该接口的预初始化方法postProcessBeforeInitialzation()对Bean进行加工操作。(Spring的AOP就是用它实现的)
Ⅴ Bean实现了InitializingBean接口 → 则Spring将调用afterPropertiesSet()方法。
Ⅵ 在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法
Ⅶ 有BeanPostProcessir和Bean关联,Spring调用该接口的初始化方法postProcessAfterInitialization().(此时Bean已经被应用程序使用了)
Ⅷ 指定生命周期
Bean被指定了该Bean的作用范围为singleton
* 将Bean放入Spring IoC的缓存池。
* 将触发Spring对该Bean的生命周期管理。
Bean被指定了该Bean的作用范围是prototype
* Bean交给调用者。
* 调用者管理该Bean的生命周期,Spring不再管理该Bean。
Ⅸ 摧毁
Bean实现了DisposableBean接口,Spring会调用destory()方法将Spring中的Bean摧毁。
在配置文件中通过destory-method属性指定了Bean的摧毁方法。(Spring将调用该方法进行摧毁。)
注意:
1、不要过多的使用Bean实现接口,因为这样会使代码和Spring聚合比较紧密。
Spring AOP(Aspect-Oriented Programming)面向切面编程=面向方向编程
解决问题
① 传统的业务处理代码,事务处理、日志记录。
实现:使用oop组合或者继承的方式来达到代码重用。
② 代码过于分散,增加了开发人员的工作量,提高了代码的出错率。
原理
① 横向抽取机制:AOP是OOP的延伸和补充。
② OOP:只能实现纵向重用。
优点:不但提高了开发效率,而且增强了代码的可维护性。
AOP的框架
① Spring AOP:纯java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类织入增强的代码。
② AspectJ
Ⅰ 基于Java的AOP框架。
Ⅱ AspectJ扩展了java语言。
Ⅲ 提供了一个专门的编译器。
Ⅳ 在编译时提供横向代码的织入。
关键词
术语 | 说明 |
---|---|
Aspect(切面) | 封装用于横向插入系统功能的类。(使用Bean指定) |
Joinpoint(连接点) | 程序执行的某个阶段点对象的一个操作=方法的调用=异常的抛出 |
Poincut(切入点) | 切面与程序流程的交叉点=需要处理的连接点=方法名或类 |
Advice(通知/增强处理) | 在特定的切入点执行的增强处理 = 在定义好的切入点处执行所要执行的程序代码 = 切面类中的方法=切面的具体实现 |
Target Object(目标对象) | =所有被通知的对象=增强对象(如果AOP框架采用的是动态的AOP实现,=一个被代理对象) |
Proxy(代理) | 当通知应用到目标对象之后,被动态创建的对象 |
Weaving(织入) | 将切面代码插入到目标对象上,从而生成代理对象的过程。 |