第一章 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 DAOJDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。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管理生命周期

作用域与生命周期的关系
singletonSpring能够精确的知道的Bean何时被创建,何时初始化完成以及何时销毁
prototypeSpring只负责创建,剩下的交给客户端代码来管理

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(织入)将切面代码插入到目标对象上,从而生成代理对象的过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-攀-登-者-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值