Spring框架(深入SpringIOC容器学习(一))

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

Spring知识

  一丶SpringIOC初步认识↓↓↓
第一篇---->初识Spring
  二丶SpringIOC深入↓↓↓
第二篇---->深入SpringIoC容器(一)
第三篇---->深入SpringIoC容器(二)
  三丶装配SpringBean↓↓↓
第四篇---->依赖注入的方式
第五篇---->基于xml装配Bean
第六篇---->基于注解装配Bean
第七篇---->Spring Bean之间的关系
第八篇---->SpringBean的作用域
第九篇---->Spring 加载属性(properties)文件
第十篇---->Spring表达式(SpEL)
第十一篇---->Spring在xml中配置组件扫描
  四丶面向切面编程↓↓↓
第十二篇—>认识SpringAOP及底层原理
第十三篇—>使用@AspectJ注解开发AOP
第十四篇—>使用xml配置开发AOP
  五丶Spring中数据库编程↓↓↓
第十五篇—>数据库编程JdbcTemplate
  六丶Spring事务管理↓↓↓
第十六篇—>Spring事务管理初识
第十七篇—>编程式事务和声明式事务
第十八篇—>事务ACID特性
第十九篇—>事务传播行为
第二十篇—>事务隔离级别

二丶深入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 方法)接受来自如容器的资源注入.
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值