《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是框架最核心的部分。

  

时间: 2024-10-11 21:26:39

《Spring实战(第三版)》 之旅(一)的相关文章

《Spring实战 第三版》二

第二章 装配Bean 在Spring中,对象无需自己负责查找或创建与其相关联的其他对象 相反,容器负责把需要相互协作的对象引用赋予各个对象 创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质 声明Bean Spring是一个基于容器的框架 但是如果没有对Spring进行配置,那它就是一个空容器,不起任何作用 所以我们需要配置Spring来告诉它需要加载哪些Bean和如任何装配这些Bean 这样才能确保它们能够彼此协作 从Spring3.0开始,Spring容器提供了两种配置Bean

Spring实战(第4版).pdf - 百度云资源

http://www.supan.vip/spring%E5%AE%9E%E6%88%98 Spring实战(第4版).pdf 关于本书 Spring框架是以简化Java EE应用程序的开发为目标而创建的.同样, 本书是为了帮助读者更容易地使用Spring而编写的.我的目标不是为 读者详细地列出Spring API,而是希望通过现实中的实际示例代码来 为Java EE开发人员展现Spring框架.因为Spring是一个模块化的框 架,所以这本书也是按照这种方式编写的.我们知道并不是所有的开 发人

Spring实战(第4版)pdf

下载地址:网盘下载 Spring实战(第4版)是非常畅销的Spring图书也是国内读者极其熟悉的Spring经典图书之一,Java web开发从入门到精通,了解Java Spring技术内幕. 全球有超过100 000的开发者使用本书来学习Spring中文版累计销售超10万册,畅销经典Spring 技术图书,针对Spring 4 全新升级作者Craig Walls,SpringSource的软件开发人员,也是一位畅销书作者.第3版译者继续翻译新版,品质保障! <Spring实战(第4版)>是经

Spring 实战-第三章-条件化的bean

在使用的时候,某些bean需要在某些特定条件化才能实例化,spring中使用的@Condition注解实现这个功能. 1.接口 package main.java.soundsystem; public interface CompactDisc { void play(); } 2.实现 package main.java.soundsystem; import org.springframework.context.annotation.Conditional; import org.spr

Spring in action(Spring实战) 第四版翻译

第一部分 Spring核心 Spring提供了很多功能,但是所有这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包括: Spring的bean容器 探索Spring的核心模块 强大的Spring生态系统 Spring的新特性 现在是java程序员的好时代.在长达20年的发展过程中,java经历了一些好时光,也经历了一些坏时光.尽管有一些粗糙的地方,例如applet,Enterprise javabean(EJB),Java数据

Spring实战 (第3版)——AOP

横切关注点可以被模块化为特殊的类,这些类被称为切面.这样做有两个好处:首先,每个关注点现在都只集中于一处, 而不是分散到多处代码中:其次,服务模块更简洁,因为它们只包含主要关注点(或核心功能)的代码,而次要关注点的代码 被转移到切面中了. Spring对AOP的支持局限于方法拦截. Spring在运行期通知对象. 切点和通知是切面的最基本元素.

【spring实战第五版遇到的坑】第14章spring.cloud.config.uri和token无效

本文使用的Spring Boot版本为:2.1.4.RELEASE Spring Cloud版本为:Greenwich.SR1 按照书上的做法,在application.yml中配置配置服务器的地址和Vault token相关的配置时,在启动的时候发现这两个配置没有生效,使用的还是默认的配置服务器的地址:http://localhost:8080, token也是空的. 解决办法,在类路径下新建bootstrap.yml或者bootstrap.properties文件,也就是在项目的src/ma

spring实战第四版第五章pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion&

Spring实战(1)

本博客是参考Spring实战第四版,对其中重要的知识点进行总结. Spring是如何简化java开发的? 答:(1)基于POJO的轻量级和最小侵入性编程:(2)通过依赖注入和面向接口来松耦合:(3)基于切面和惯例进行声明式编程:(4)通过切面和模板来减少样板式代码: 配置Spring容器三种主要的装配机制? 答:(1)在XML中显示配置:(2)在java中进行显示配置:(3)隐式的bean发现机制和自动装配: Spring从两个角度来实现自动化装配? 答:(1)组件扫描:Spring会自动发现上