前言
一个寒假吧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是框架最核心的部分。