Spring框架(深入SpringIOC容器学习(一))
目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
Spring知识
第一篇---->初识Spring
第二篇---->深入SpringIoC容器(一)
第三篇---->深入SpringIoC容器(二)
第四篇---->依赖注入的方式
第五篇---->基于xml装配Bean
第六篇---->基于注解装配Bean
第七篇---->Spring Bean之间的关系
第八篇---->SpringBean的作用域
第九篇---->Spring 加载属性(properties)文件
第十篇---->Spring表达式(SpEL)
第十一篇---->Spring在xml中配置组件扫描
二丶深入SpringIoC
1 Spring IoC概念
1.1 Spring概述
- Spring框架是Java
应用最广
的框架.它的成功来源于理念,而不是技术本身
.它的理念包括IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)
.其中IoC是Spring的基础,而AOP则是其重要功能,最为典型的当属数据库事务的使用.应该说Spring框架已经融入到了JavaEE开发的各个领域.
1.1.1 Spring历史
- Spring从2004年第一个版本至今已经过去15年多了.Spring的出现是因为当时SUN公司EJB的失败,尤其是在EJB2的时代,EJB2需要许多配置文件,还需要配合很多抽象概念才能运用.虽然EJB3克服了配置方面的冗余,但是对于JavaEE开发而言,更为致命的是对EJB容器的依赖,也就是EJB只能运行在EJB容器中,EJB容器的笨重,给一些企业应用带来了困难,企业更喜欢轻便,容易开发和测试的环境.而在EJB开发中,需要选择EJB容器,然后通过EJB容器发布Bean,应用则可以通过EJB容器获得对应的Bean
- 这一方式存在两方面问题.首先,它比较缓慢,从容器中得到Bean需要大量的远程调用,反射,代理,序列化和反序列化等复杂步骤,对开发者来说是很大的挑战.其次,对EJB容器依赖比较重,难以达到快速开发和测试的目的,对于测试人员而言需要部署和跟踪EJB容器,所以EJB2和EJB3都在短暂繁荣之后迅速走向没落.
-
EJB的没落造就了Spring的兴起
.在Spring中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的IoC容器,所以Spring是一种基于Bean的编程.Spring就在EJB2失败的缝隙中出现了,它是由一位澳大利亚的工程师--Rod Johnson(学历上是一位音乐博士学位)所提倡的
,它深刻的改变了Java开发世界,迅速地使得Spring取代了EJB成为了实际的开发标准.
- Rod Johnson指出了Spring的一些优势.首先它是一个程序员乐于使用的框架.其次,它不依赖于Spring所提供的API,也就是无侵入性或者低侵入性,即使Java应用离开了Spring依旧可以运行,这使得Spring更加灵活,拥有即插即拔的功能.最后,Spring不是要去取代当时存在的EJB,Hibernate等技术,而是将这些框架和技术整合到Spring中去,这意味着Spring提供的是一个支持它们开发的模板,比如支持MyBatis开发的SQLSessionTemplate,支持Redis开发的RedisTemplate等.
1.1.2 Spring特点
-
轻量级:Spring是非侵入性的
,基于Spring开发的应用中的对象可以不依赖与Spring的API -
控制反转
----实现了低耦合,应用了IoC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或查找对象 -
依赖注入
—DI(Dependency injection) -
面向切面编程
–AOP(Aspect Oriented Programming),将业务逻辑和具体服务分开 -
容器
–Spring是一个容器,因为它包含并且管理应用对象的生命周期 -
框架
:Spring实现了使用简单的组件配置组合成一个复杂的应用,在Spring中可以使用xml和Java注解组合这些对象 -
一站式
:在IoC和AOP的基础上可以整合各种应用的开源框架和优秀的第三方类库(实际上,Spring也提供了非常优秀的表现层的SpringMvc和持久层的Spring Jdbc)
1.1.3 Spring模块
- 模块图
- 核心容器(Core Container)------Spring的核心容器是其他模块建立的基础,有
Spring-core,Spring-beans,Spring-context,Spring-context-support和Spring-expression(Spring表达式语言)
等模块组成
1) spring-core模块:提供了框架的基本组成部分,包括控制反转和依赖注入
功能
2) spring-beans模块:提供了BeanFactory,是工厂模式的一个经典实现
,spring将其管理的对象称为Bean
3) spring-context模块:Spring上下文,向spring框架提供上下文信息,建立在spring-core和spring-beans模块的基础上,提供一个框架式的对象访问方式,是访问定义和配置的任何对象的媒介,ApplicationContext接口
是context模块的焦点
4) spring-context-support模块:支持整合第三方库到spring应用程序上下文,特别是用于高速缓存和任务调度的支持
5) spring-expression模块:提供了强大的表达式语言
去支持运行时查询和操作对象. - AOP和Instrumentation
1) spring-aop模块:提供了一个符合AOP要求的面向切面的编程实现,允许定义方法拦截器和切入点
,将代码按照功能进行分离,以便干净地解耦
2) spring-aspects模块:提供了与AspectJ的集成功能
,AspectJ是一个功能强大且成熟的AOP框架
3) spring-instrument模块:提供了类植入(Instrumentation)支持和类加载器的实现,可以在特定的应用服务器中使用 - 消息
1) Spring4.0以后新增了消息(Spring-messaging)模块
,该模块提供了对消息传递体系结构和协议的支持 - 数据访问/集成----由
Jdbc,ORM,JMS,OXM和Transactions事务模块
组成
1) spring-jdbc模块:提供了一个Jdbc的抽象层
,消除了繁琐的Jdbc编码和数据库厂商特有的错误代码解析
2) spring-orm模块:为流行的对象关系映射(Object-Relational Mapping)API
提供了集成,包括JPA和Hibernate.使用spring-orm模块可以将这些ORM映射框架与Spring提供的所有其他功能结合使用,例如声明式事务管理
3) Spring-oxm模块:提供了一个支持对象/xml映射的抽象层实现
4) spring-jms模块(Java Messaging Service):指Java消息传递服务,包含用于生产和使用消息的功能.
5) spring-tx模块(事务模块):支持用于特殊接口和所有POJO(普通Java对象)类的编程和声明式事务管理 - Web----由
spring-web,spring-webmvc,spring-websocket,portlet模块
组成
1) spring-web模块:提供了基本的web开发集成功能,例如多文件上传,使用Servlet监听器初始化一个IOC容器以及web应用上下文
2) spring-webmvc模块:也称为web-servlet模块,包含用于web应用程序的springMvc和REST Web Service实现
.SpringMvc框架提供了领域模型代码和web表单之间的清晰分离,并与Spring Framework的所有其他功能集成
3) spring-websocket模块:spring4.0后新增模块,提供了websocket和socket JS的实现
4) portlet模块:类似于Servlet模块的功能,提供了portlet环境下的mvc的实现 - 测试
Spring-test模块支持使用JUnit或TestNG
对Spring组件进行单元测试和集成测试。
1.1.4 Spring主要jar包及其作用
1.1.5 Spring常见注解(提前总结,看不懂没关系,看完SSM回头就明白了)
1.1.6 Spring第三方整合(提前总结,看不懂没关系)
1.2 Spring IoC概述
1.2.1 案例引入
- 控制反转是一个比较抽象的概念,下面通过一个例子进行说明.实际生活中,当你要用一个东西,基本的想法是找到东西,比如想喝杯橙汁,在没有饮品店的情况下,最直观的做法是,买果汁机,橙子,热水.请注意这是你自己
主动创造
的过程,也就是一杯橙汁需要主动创造.到了今天,饮品店很多,已经没必要自己去榨橙汁的.想喝橙汁的想法一出现,第一个想法就是通过联系饮品店,将自己的需求,地址,联系方式告知,下单等待即可.这里你并没有主动创造
橙汁,橙汁是由饮品店创造的,而不是你,但也达到了你的要求.这个例子中就包含了控制反转的思想.
1.2.2 代码模拟–主动创建对象
- 如果需要橙汁,那么就等于需要橙子,开水,糖等原谅,果汁机是工具.如果需要主动创造果汁,就需要创建对应的对象—JuiceMaker(果汁生成器)和Blender(搅拌器).如下图
- 主动创造橙汁,需要我们实现自己可能不太熟悉的工作–如何搅拌橙汁,这里的mix方法显然不是一个好方法,果汁对象依赖于水,水果,糖和搅拌机等,这些关系都需要我们自己去维护
- 现实中比这麻烦且关系复杂的系统多得是,如果都采用这样的维护方式,那么将会非常复杂.更多时候我们并不希望了解具体的过程,只需要得到最终结果,正如果汁例子一样,现实生活中,我们更加希望是通过对饮品店的描述得到果汁,只对结果进行描述,得到我们想要的东西,这就是
被动创建对象
.
1.2.3 代码模拟–被动创建对象
- 饮品店提供了制作果汁的方式,并且为我们提供一份原料清单供我们选择,将具体需求配置好传递给饮品店即可
- 显然我们并不需要去关注果汁如何被创建,只需要采用xml文件对自己的需求进行描述
- 描述完自己的需求后,就可以选择饮品店,假设选择贡茶
- 上面将饮品店设置为贡茶,这样就可以指定贡茶为我们服务,通过下面的代码就可以得到我们需求中的果汁了
- 在这个过程中,`果汁是由贡茶制造的,我们并不关心制造的过程,只关心对果汁如何描述,选择哪个店去制作,这才是我们如今的习惯,这个理念也可以应用于程序代码.
1.2.4 控制反转阐述
-
控制反转概念
:控制反转是一种通过描述(在Java中可以是xml或注解)并通过第三方去产生或获取特定对象的方式 - 其思想是
反转资源获取的方向
. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源
. 这种行为也被称为查找的被动形式 - Spring中
实现控制反转的是IoC容器
,实现方法是依赖注入
(Dependency Injection,DI)----即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入.