第1章 Spring之旅(笔记)

来源:互联网 发布:网络同步时间在线 编辑:程序博客网 时间:2024/06/07 07:07

Spring的诞生对于Java工程师是一件极具历史意义的事,因为它不仅简化了java开发,这对于推荐"码农"这个职业也是具有一定意义的.当然我对码农的理解是褒义的,因为当今的社会,和电脑交流比和人交流简单的多,不是吗?好了言归正传,让我们从整体上感知一下Spring.


1.Spring如何简化java开发

为了降低java开发的复杂性,Spring采取了一下4种关键策略:
*基于pojo的轻量级和最小侵入性编程
*通过依赖注入和面向接口实现松耦合
*基于切面和惯性进行声明式编程
*通过切面和模板减少样板式代码

1.1基于pojo的轻量级和最小侵入性编程

轻量级:
EJB是Spring诞生之前的一种容器技术,它有这样的一个特点:"买一送三",比如,我只需要JTA服务,不需要JMS等其他服务,然而EJB里是实现不了的这样场景的,它只会将全部"用到的"以及"用不到的"服务都添加.于是Spring诞生了,一个"可选择型"的容器.所以我对轻量级的理解便是:需要什么添加什么.
最小侵入性:
Spring不会强迫你实现Spring规范的接口或者继承Spring规范的类,相反,基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring.最坏的场景是,一个类或许会使用Spring注解.

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

依赖注入(DI):
为什么需要DI?任何有实际意义的应用都会有两个(或以上)的类组成,这些类相互之间进行协作来完成特定的业务逻辑.传统做法,每个对象负责管理与自己相互协作的对象的引用.但这将导致高度耦合.
PS:耦合具有两面性.一方面,紧密耦合的代码难以测试,难以复用,难以理解.另一方面,一定程度的耦合又是必须的---完成没有耦合的代码什么也做不了.
通过DI,对象的依赖关系由系统中负责协调各对象的第三方组件在创建对象的时候进行设定
PS:创建应用组件之间协作的行为通常称为装配(wiring)
面向接口:
面向接口的好处就是,当需要切换实现方式的时候,该接口的调用者,并不需要知道修改详情以及修改调用的代码

1.3基于切面和惯性进行声明式编程

基于切面:
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件.
基于切面的应用,诸如日志,事物管理和安全等功能.
惯性:
其实我对这个名词是不理解的,在编程的范畴里.于是我百度了一下找到了这样的解释:
有的东西存在了,即使是不合理的存在,因为它存在了一段时间,因为惯性,它还会存在在哪里!

1.4通过切面和模板减少样板式代码

有过JDBC编码经验的都知道,"无用的"代码太多,真正与业务相关的代码却只有几行.但是你又不得不一遍遍的重复这样的代码.
JDBC不是产生样板式代码的唯一场景.Spring旨在通过模板封装来消除样板代码.Spring的JdbcTemplate使得执行数据库操作是,避免传统的JDBC样板式代码.

2.Spring容器

2.1什么是容器

在编程范畴里,容器就是一组提供一系列服务的管理器,只要你符合容器的服务要求(规范),容器就可以让你使用其内部的管理服务.
比如Servlet容器的概念,Servlet容器中包含了很多内置对象,但是想要使用这些对象需要实现servlet接口,虽然这些都是各个web应用服务器实现的.

2.2Spring容器

Spring容器并不是只有一个.Spring自带了多个容器实现,可以归为两种不同的类型.
bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持.
应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给事件监听者
显而易见,应用上下本要比bean工厂更受欢迎
常用的Spring应用上下文:
AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文;
AnnotationConfigWebApplicationContext:从一个或多个基于java的配置类中加载Spring Web应用上下文
ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
FileSystemXmlApplicationContext:从文件系统下的一个或者多个XML配置文件中加载应用上下文定义
XmlWebApplicationContext:从Web应用下的一个或者多个XML配置文件中加载应用上下文定义

2.3bean的生命周期

1.Spring对bean进行实例化
2.Spring将值和bean的引用注入到bean对于的属性中,机填充属性
3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
4.如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
5.如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
6.如果bean实现了BeanPostProcesser接口,Spring将调用它们的的postProcessBeforeInitialization()方法,进行预初始化.
7.如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法.类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用.
8.如果bean实现了BeanPostProcesser接口,Spring将调用它们的postProcessAfterInitialization()方法.
9.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,知道该应用上下文销毁
10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法.同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用.

3.俯瞰Spring风景线

3.1Spring模块

这里写图片描述 


1.Spring核心容器
容器是Spring框架最核心的部分,它管理者Spring应用中bean的创建,配置和管理.在该模块中,包括了Spring bean工厂和多种基于bean工厂的Spring应用上下文的实现,此外,该模块也提供了许多企业服务,例如E-mail,JNDI访问,EJB集成和调度
2.Spring的Aop模块
在Aop模块中,Spring对面向切面编程提供了丰富的支持.该模块是Spring应用系统中开发切面的基础.与DI一样,帮助应用对象解耦.
3.数据的访问和集成
该模块抽象了数据访问的样板式代码,构建了一个语义丰富的异常层.Spring的事物管理支持所有的ORM框架以及JDBC.该模块同样包含了在JMS之上的Spring抽象层,它会使用消息以异步的方式与其他应用集成
4.Web与远程调用
提供了基于MVC模式的Spring MVC框架.以及多种构建与其他应用交互的远程调用方案.Spring还提供了暴露和使用REST API的良好支持
5.Instrumentation
Spring的Instrumentation模块提供了JVM添加代理功能.具体来讲,它为Tomcat提供了一个织如如代理,能够为Tomcat传递类文件,就想这些文件是被加载器加载的一样
6.测试
Spring为使用JNDI,Servlet和Protlet编写单元测试提供了一系列的mock对象实现.对于集成测试,该模块为加载Spring应用上下文中的bean集成以及与Spring上下文的bean进行交互提供了支持

3.2Spring的子项目

1.Spring Web Flow
Spring Web Flow建立于SpringMVC框架孩子上,它为基于流程的会话式Web应用提供了支持
2.Spring Web Service
虽然核心的Spring框架提供了将Spring bean以声明的方式发布为Web Service的功能,但是这些服务是基于一个具有争议性的架构(拙劣的契约后置模型)之上构建的.这些服务的契约由bean的接口决定.Spring Web Service提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的
3.Spring Security
利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制
4.Spring Integration
Spring Integration提供了多种通用应用集成模式的Spring声明式风格实现
5.Spring Batch
如果需要开发一个批处理应用,可以通过Spring Batch,使用Spring强大的面向POJO的编程模型.
6.Spring Data
7.Spring Social
8.Spring Mobile
9. Spring For Android
10.Spring Boot
...

0 0