《Spring实战(第三版)》 之旅

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Spring实战(第三版)》 之旅相关的知识,希望对你有一定的参考价值。

前言

 一个寒假吧SSM学完了,也不能说是学完了,只能说是过了一遍,知道大体的流程,框架的搭建,但具体的实现原理,为什么要这样,什么时候要这样,概念还是很模糊。

  反正经过这五大框架的学习,感觉最重要的还是Spring框架,于是乎,开学时期偶得一书《Spring实战》,在网上口碑还是蛮高的,于是继续深入学习(复习)下Spring这个框架。

  到目前为止已经读到了第8章 使用Spring Web Flow ,突然想到了写写博客记录下读书的历程,也能说是总结?笔记?反正就是自己在看这部分内容的时候心里在想什么。

  好开始!

第一章 Spring之旅

  该章的主要内容是:

  • 探索Spring核心模块
  • 解耦应用对象
  • 使用AOP管理横切关注点
  • spring 的bean容器

  本章刚开始介绍了下SPRING的产生背景,赞美了下java语言刚出来是多么的新兴,多么的激动人心,然后在开发过程中开发人员遇到了了一个非常大的问题:随着开发的进行,项目的复杂度越来越高,有一些复杂的应用如事务,安全,分布,这些JAVA API没有直接给出而是要自己去写,当时的Javabean规范已经满足不了当时的需求了,于是乎SUN公司发布了一个EJB规范(不知道这是什么鸟,反正书上就是这样写的,也没用过),然后这个规范脱离了javabean,但是啊,人们还是想的太简单了,EJB还是太垃圾了,并没有完成当初的设想,貌似是太笨重了。于是大家又想重新回归Javabean规范,Spring就是这个时候被发明出来的,这个框架已经成为了POJO的轻量级,注意!轻量级!开发框架的领导者,注意!领导者! Spring大法好!

  1.1 简化 JAVA开发

  前面说了几行废话,告诉我们什么技术在哪本书上写了叫我们去看(不去)。前面一大段我得到的信息就是:

  Bean的同义词是POJO

       接下来简单说明了,Spring的作用是简化开发,降低了JAVA开发的复杂性,采取了下面四种策略:

      1.基于POJO的轻量级和最小侵入性编程

  2.通过依赖注入和面向接口实现松耦合

  3.基于切面和惯例进行声明式编程

  4.通过切面和模减少样板代码

     1.1.1 激发了POJO的潜能

  这里写出了一段代码,这段代码我换种例子来理解:

  一个类叫dog继承了一个接口叫Animal 这个Animal有很多方法:fly(),eat(),sing()....

  在这里我这个dog要实现Animal的接口,然后实现了fly eat ...这些方法,但我这只猪只会 eat 啊,fly sing这些方法我不需要,但是又要去实现一个空的,这样代码显得非常多余(不好看)。

  那么我为什么不可以直接实现eat这个方法而忽略其他的方法呢?这时候spring的优越性就来了,他不需要你实现其他的方法只需要单独写一个 eat(){return "shit"} 就OK了,简单,优美。

  1.1.2 依赖注入

  依赖?注入?这是什么鬼,虽然经常听这个词但还是不能特别理解,依赖什么?注入什么?

  书上又写了一个例子,例子的的Class类紧耦合与一个接口,意思和上一个差不多,然后列举了这样写代码的缺点:

      1.单元测试困难,因为紧耦合,你如果要进行单元测试的话你还要保证另一个其他类的方法被调用

  2.紧密耦合的代码难以不仅难测试,而且难复用,难理解,谁希望看到一大串的实现,一大串的对象,一大串声明的方法啊。

       然后Spring又来解决问题了,这时候就要用到依赖注入(DI)

  你想想我的类能不能在构建函数的时候传进一个其他类(该类实现了同一个接口),我要什么就传什么,我Dog类我生病了我在构建的时候传入一个Doctor ,我饿的时候传入一个Cook,我被欺负的时候传入一个Host(主人是这个单词吧。。。),反正这些传入的都继承human这个接口,我要什么传什么,而不是硬编码直接在上面声明。这就是依赖注入(DI)中的构造器注入

      这样耦合度松了一些,当然,上面的单元测试困难的问题也迎刃而解,书上的例子上给了一个mock实现,这个东西大概的作用应该是,给一个.class文件,然后可以生成该class文件的java文件的对象。具体也不去深究了,不是重点。

  解决硬编码的一个方式就是配置XML文件,Spring也是,你可以在一个xml文件中装配一个Bean,这个有点难理解,梳理下:

  在我的理解上,Spring好比一个大杯子,里面的Bean就是杯子里的物体,每一个Bean都有自己的一些属性,你的ID是什么name是什么,属于哪一个POJO,这样的话,在构建项目的时候,我需要什么,,我直接在这个杯子中找,找到了这个我要的Bean,我就可以使用它,我不要,就把他扔掉,这样的话类与类之间的关系从以前的,相依为命,相濡以沫,变为了现在的,我要你就过来,我不要你你就走远一点。

  后面接着介绍了如何获取这个Bean,我就不写了。然后又说,如果你还想了解依赖注入,推荐你读什么什么书。。估计作者广告费没少收。

1.1.3应用切面

  切面是一个很神奇的东西,面向切面编程的英文简写是AOP,这个AOP的功能是让你更加专注于自己的业务,把那些可重用的(就是要重复写好多次的)的东西抽取出来,例如日志,事务,安全(安全我还没用过。。反正书上就是这样写的),代码只要写一次,然后哪个方法要我就“切过去”。

    后面都是些AOP的具体实现,我还是用书上的例子来理解:

  书上说有一个骑士,天天打胜仗,很牛逼,于是为了赞美这个骑士,出现了一个诗人,每次调用骑士打胜仗的方法诗人就要歌颂一遍,打之前歌颂一遍,打完之后再来一遍。这里可以看出,我们主要业务就是骑士打仗,这个歌颂和打仗关毛线的事情,于是我把歌颂这个方法抽取出来,配置到Spring的XML(杯子)中,并且在杯子上规定,每次我调用骑士的这个方法你必须歌颂一遍。这就是AOP,他把一个业务类切成很多块,里面有很多名词后面再说,然后歌颂这个方法你可以看哪里可以插进去,就插哪里。

  具体配置略。

1.1.4 使用模板消除代码

  这节没什么实质性的的内容,都在吹Spring多么好。然后引出下一章节的重点

1.2 容纳你的Bean

  这一章就是重复了我刚刚说的:Spring是一个容器可以容纳很多Bean blabla。。。

1.2.1与应用上下文公事

  Spring自带了几种类型的应用上下文(告诉我你是用的哪个Spring容器(杯子))

      1.ClassPathXmlApplicationContext---从类路径下的xml配置文件中加载上下文定义,把应用上下文定义当作类资源。

      2.FileSystemXmlApplicationContext--读取文件路径下的XML配置文件并加载上下文定义。

  3.XmlWebApplicationContext--读取web应用下的XML配置文件并装载上下文定义。

  然后说了用什么方法如何加载配置文件,略。

 1.2.2 Bean的生命周期

  传统下的Bean生命周期很简单,在JAVA 关键字new的时候就开始对Bean实例化,一旦这个Bean不使用了,则由java进行垃圾回收。

  Spring的生命周期就比较复杂了,具体如下:

  1、Spring对bean进行实例化

  2、Spring将值和bean的引用注入到bean对应的属性中(比如说注入到被依赖的bean的方法中或属性里)

  3、如果bean实现了BeanNameAware接口,将会将bean的Id传入setBeanName()方法中

  4、如果bean实现了BeanFactoryAware接口,将会设置bean的BeanFactory的引用传入到setBeanFactory()方法中

  5、如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()传入bean的上下文的引用

  6、如果bean实现了BeanPostProcessor接口,Spring将调用bean的属性初始化之前的预处理方法postProcessBeforeInitialization()方法

  7、如果bean实现了InitializingBean接口,Spring将调用afterPropertiesSet()方法。如果bean使用init-method声明了初始化方法,改方法也会被调用

  8、如果bean实现了BeanPostProcessor接口,Spring将调用postProcessAfterInitialization

  9、此时bean已经准备就绪,可以被应用程序使用了,它将一直驻留在应用上下文中,直到该应用上下文被销毁

  10、如果bean实现了DisposableBean接口,Spring将调用他的destroy()方法,如果使用了destroy-method也会调用该方法。

    (这些都是抄书上的,这些内容中涉及了很多源码方面的东西,一时间还真的消化不了)

1.3 俯瞰Spring风景线

  这里介绍了Spring的jar包,介绍了Spring的其他成员

1.3.1 Spring模块

技术分享

这里就是Spring的一些模块,这里开始一一做简单介绍

  核心Spring容器

  这里是Spring最核心的地方,他负责Spring中的Bean的创建、配置和管理,不仅如此,该模块还提供了很多企业级的服务,例如邮件、JNDI访问、EJB继承和调度。

  所以,Spring所有的模块都在该基础上,在配置应用其实也在使用这些类。对应的应该是Spring的core包

  Spring的AOP模块

  就是使用AOP要导入的包,没什么好说的

  数据的访问和集成

  你有没有一个感觉,在和数据库打交道的时候要写很多模板代码,例如获得数据库连接、创建语句、处理结果集blabla,Spring这个神奇的东西又把这些问题解决了,他把这些模板代码全部都封装了起来,重要的是!还封装了很多异常信息(这里在后面细讲,现在提一下),反正就是再强调遍Spring大法好!

  Web和远程调用

  这里推崇一种MVC的设计模式,于是引入了一些其他框架什么Strus2啊JSF啊等等(我只用过Struts2不过貌似被淘汰了),总是这个就是可以和很多流行的MVC框架整合表示Spring的松耦合。

  测试

  Spring对于测试这块提供了一些模拟对象的实现(应该就是前面说的mock,假装创建了一个对象,不知道这样理解对不对)

1.3.2 Spring portfolio

  不知道这是什么。。。。看不懂。

1.4 Spring新功能

   这些我就复制粘贴了,了解下就行了

技术分享技术分享

 

还有就是Sping Portfollo 新特性没列举出来,因为我写这篇博客的时候我还不知道这是什么东西。。。。希望以后自己能补充

1.5 小结(挑重点抄书)

  1.Spring促进了代码松耦合。成功的关键在于依赖注入和AOP

  2.依赖注入是组装应用对象的一种方式,对象无需知道依赖来自何处或者依赖的实现方式。

  3.不同于自己获取依赖对象,依赖对象赋予他们所以来的对象。

  4.依赖对象通常只能通过接口了解所注入的对象,这样保证松耦合。

  5.AOP可以帮助应用将散落在各处的逻辑汇集于一处 —— 切面

  6.依赖注入和AOP是框架最核心的部分。

  




















以上是关于《Spring实战(第三版)》 之旅的主要内容,如果未能解决你的问题,请参考以下文章

《Spring实战 第三版》四

企业级项目实战讲解!深入理解java虚拟机第三版下载

android编程权威指南 第三版 pdf

《Effective Java 第三版》——第十章 异常

欢迎购买复旦大学高等代数教材(第三版)和高等代数学习指导书(第三版)

寻 线性代数及其应用 第三版 课后答案 (David C. Lay)