<Spring实战>学习总结

1 Spring之旅

Spring核心:依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP)

简单老式Java对象(Plain Old Java Object,POJO)

Spring最根本的使命:简化Java开发.在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring.

耦合具有两面向.一方面,紧密耦合的代码难以测试,难以复用,难以理解,并且典型的表现出"打地鼠"式的bug特性;一方面,一定程度的耦合又是必须的--完全没有耦合的代码什么也做不了.

创建应用组件之间协作的行为通常称为装配(wiring).

DI能够让相互协作的软件组件保持轻耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件.

Spring表达式的语法采用的是AspectJ的切点表达式语言.

容器是Spring框架的核心.Spring自带多个容器实现,可以归为两种不同的类型.bean工厂和应用上下文.

MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法.Java从来不缺少MVC框架,Apache的Struts,JSF,WebWork和Tapestry都是可选的最流行的MVC框架.

2 装配Bean

任何一个成功的应用都是由多个为了实现某一业务目标而相互协作的组件构成的.

创建应用组件之间的协作关系的行为通常称为装配(wiring),这也是依赖注入的本质.

Spring从两个角度来实现自动化装配:组件扫描(component),自动装配(autowiring).

尽管@Inject和@Autowired之间有着一些细微的差别,但是在大多数场景下,它们都是可以互相替换的.

@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节.

@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean.

容器负责管理应用中组件的生命周期,它会创建这些组件并保证它们的依赖能够得到满足,这样的话,组件才能完成预定的任务.

3 高级装配

Spring定义了多种作用域,可以基于这些作用域创建bean,包括:单例(Singleton),原型(Prototype),会话(Session),请求(Request).

为了避免硬编码,而是让值在运行时再确定,Spring提供了两种在运行时求值的方式:属性占位符(Property placeholder),Spring表达式语言(SpEL).

SpEL与FreeMarker类似,可以依靠它们写一些优雅方便的代码,但不应用作于主体逻辑.

4 面向切面的Spring

日期,安全和事务管理功能需要用到应用程序的多个地方,但是我们又不想在每个点都明确调用它们.

在软件开发中,散布于应用中多处的功能被称为横切关注点(cross-cutting concern).

AOP可以实现横切关注点与它们所影响的对象之间的解耦.

如果要重用通用功能,最常见的面向对象技术是继承(inheritance)或委托(delegation).

但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系,而使用委托可能需要对委托对象进行复杂的调用.

切面为另一种替代方案,横切关注点可以被模块化为特殊的类,这些类被称为切面(aspect).

这样做有两个好处:首先,每个关注点都集中于一个地方,而不是分散到多处代码中;其次,服务模块更简洁,因为他们只包含主要关注点的代码,而次要关注点的代码被转移到切面中.

定义AOP术语:

1.通知(Advice):通知定义了切面是审核以及何时使用.(Spring切面可以应用5种类型的通知)

2.连接点(Join point):连接点是在应用执行过程中能够插入切面的一个点.

3.切点(Poincut):如果说通知定义了切面的"什么"和"何时"的话,切点就定义了"何处".

4.切面(Aspect):切面是通知和切点的集合.

5.引入(Introduction):引入允许我们向现有的类添加新方法或属性.

6.织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程.(可在编译期,类加载期,运行期进行织入)

5 构建Spring应用程序

状态管理,工作流以及验证都是需要解决的重要特性.HTTP协议的无状态性决定了这些问题都不那么容易解决.

(图片5.1对快速理解更有帮助)

流程大致如下:

1.请求离开浏览器,带有请求内容信息;

2.DispatcherServlet会以查询一个或多个处理器映射(handler mapping)来确定请求的下一站在哪里;

3.一旦选择合适的控制器,DispatcherServlet会将请求发送给选中的控制器(controller);

4.控制器在完成逻辑处理后,通常会产生一些信息返回给客户并在浏览器上显示,称为模型(model),将模型数据打包,并且标示出用于渲染输出的视图(view)名,将请求连同模型和视图名发送回DispatcherServlet.

5.DispatcherServlet将会使用视图解析器(view resolver)来将逻辑视图名匹配为一个特定的视图实现.

6.视图实现,交付模型数据,请求任务完成.

7.视图将使用模型数据渲染输出,这个输出会通过相应对象传递给客户端;

DispatcherServlet是Spring MVC的核心,用以加载包含web组件的bean,如控制器,视图解析器以及处理器映射,而ContextLoaderListener加载应用中的其他bean,通常是驱动应用后端的中间层和数据层组件.

Spring MVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括:查询参数(Query Parameter),表单参数(Form Parameter),路径变量(Path Variable).

当看到视图格式中的"redirect:"前缀时,将其解析为重定向的规则,而不是视图的名称.

6 渲染Web视图

将控制其中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性.

view接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中.

以FreeMarker为例谈谈对模型使用的看法:

1.模型在一般情况下,不应与视图解析结果相差较大,它应该实现的是减少重复部分(但应仅是HTML和js无法替代或难以替代的部分);

2.大部分模型在使用时,均存在自身语法与HTML&js语法混乱的问题,考虑到当前的H5与js已经发展的较为成熟,功能与主业务逻辑应由js来承担,模型应做的,仅应限于内容本身(特别是HTML);

3.在考虑是否在模型上赋予逻辑时,安全性同样是一个重要考量.

7 Spring MVC的高级技术

基于Java的初始化器(initializer)的一个好处就在于我们可以定义任意数量的初始化器类.

当构建URL或SQL查询语句时,使用String连接是很危险的.(目前前者使用自己写的url对象化管理方法,后者用?参数注入即可解决)

8 使用Spring Web Flow

Spring Web Flow是一个web框架,它适用于元素按规定流程运行的程序,将流程的定义与实现流程行为的类和视图分类开来.

流程注册表(flow registery)的工作是加载流程定义并让流程执行器能够使用它们.

在spring web flow中,流程是由三个主要元素定义的:状态,转移和流程数据.状态(status)是流程中事件发生的地点,也是流程定义的主要部分,转移(transition)就是连接这些点的公路,流程数据即流程的当前状况.

9 保护Web应用

Spring Security从两个角度来解决安全性问题.它使用Servlet规范中的Filter保护web请求并限制url级别的访问.Spring Security还能够使用Spring AOP保护方法调用--借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法.

在任何应用中,并不是所有的请求都需要同等程度的保护.

通过HTTP发送的数据没有经过加密,黑客就有机会拦截请求并且能够看到他们想看的数据.这就是为什么敏感信息要通过HTTPS来加密发送的原因.

10 通过Spring和JDBC征服数据库

关系型数据库一直是企业级应用的统治者.

Spring的目标之一就是允许我们在开发应用程序时,能够遵循面向对象(OO)原则中的"针对接口编程".最好将数据访问的功能放到一个或多个专注于此项任务的组件中,通常称为数据访问对象(data access object)或Repository.

为了将数据访问层与应用程序的其他部分隔离开来,Spring采用的方式之一就是提供统一的异常体系.

能够触发SQLException的问题通常是不能在catch代码块中解决的.

Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)和回调(callback).模板管理过程中固定的部分,回调处理自定义的数据访问代码.

Spring提供了在Spring上下文中配置数据源bean的多种方式,包括:

1.通过JDBC驱动程序定义的数据源;

2.通过JNDI查找的数据源;

3.连接池的数据源;

11 使用对象-关系映射持久化数据

JDBC分内工作之外的一些更复杂的特性:延迟加载(Lazy loading),预先抓取(Eager fetching),级联(Cascading).

一些可用的框架提供了这样的服务,这些服务的通用名称是对象/关系映射(object-relational mapping,ORM).

Java持久化API(Java Persistence API,JPA)定义了两种类型的实体管理器:应用程序管理类型(Application-managed),容器管理类型(Container-managed).

追加dao层规范:在任何时候,除了确定原有dao层方法出现严重bug的情况下,一律不得修改已完成模块的sql逻辑,仅可对之做无影响的补充.

12 使用NoSQL数据库

有一些数据的最佳表现形式是文档(document),即将这些信息收集到一个非规范化(也就是文档)的结构中会更有意义.

文档是独立的实体,能够按照这种方式优化并处理文档的数据库,称之为文档数据库.

文档型数据库会将数据存储到粗粒度的文档中,而图数据库会将数据存储到多个细粒度的节点中.

按照最简单的形式,图数据库比文档数据库更加通用,有可能会成为关系型数据库的无模式(schemaless)替代方案.

Neo4j(一种图数据库)定义了两种类型的实体:节点和关联关系.一般来讲,节点反映了应用中的事物,关联关系定义了这些事物是如何联系到一起的.

Redis是一种特殊类型的数据库,它被称为key-value存储,就是持久化的HashMap.

持久化是将程序数据在持久状态和瞬时状态转换的机制.

不管你选择哪种数据库,从数据库中获取数据都是消耗成本的操作.

所有的文件存储,都可看成是数据持久化,且在系统层面的持久化.对比来看,文档数据可对应于word,图数据库可对应于visio,redis类似于js中var的存储格式,关系型数据库则类似于excel.

13 缓存数据

无状态的组件一般来讲扩展性会更好一些,但它们也会更加倾向于一遍遍的问相同的问题.如果问题的答案变更不那么频繁(或者根本不会发生变化),那么按照相同的方式再去获取一遍数据就是一种浪费了.

缓存(cache)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的.

缓存在目前的应用中,分为:1.从数据库到java平台的缓存;2.从后台到前台的缓存.缓存还可作为一种方法的设计思想.

Spring将缓存实现为一个切面.

本章中所属缓存,基本是适用于自数据库层至Java平台层.重要的思想是以切面实现,监控insert/update/delete两种操作,冗余与缓存作用非常类似,可认为是持久化数据库层面的缓存.对于前台的缓存,无法监控到改变数据的操作,则往往通过版本号控制.

14 保护方法应用

在Spring Security中实现方法级安全性的最常见办法是使用特定的注解.

对于非web应用来说,方法级别的安全性则是最前沿的防护.对于web应用来讲,基于安全所声明的方法级别安全性能够保护web请求.

在web项目中,安全性似乎可以托付给每次接受请求的过滤器Interceptor,此举可能存在的不足在于,仅能对请求方法,即控制器中的方法监控.另外对于安全权限,查询效率也是一个重要考量.

15 使用远程服务

远程调用是客户端应用和服务端之间的对话.

客户端向代理发起调用,就像代理提供了这些服务一样.代理代表客户端和远程服务进行通信,有它负责处理连接的细节并向远程服务发起调用.

在Spring中,使用远程服务纯粹是一个配置问题.

SOA(面向服务的架构)的核心理念是,应用程序可以并且应该被设计成依赖于一组公共的核心服务,而不是为每个应用都重新实现相同的功能.

16 使用Spring MVC创建REST API

近几年来,以信息为中心的表述性状态转移(Representational State Transfer)已成为替换传统SOAP web服务的流行方案.SOAP一般会关注行为和处理,而REST关注的是要处理的数据.

JdbcTemplate处理了JDBC数据访问时的丑陋部分,RestTemplate则在使用RESTful资源时免于编写那些乏味的代码.

17 Spring消息

异步消息是一个应用程序向另一个应用程序间接发送消息的一种方式,这种方式无需等待对方的响应.

在一部消息中有两个主要概念:消息代理(message broker)和目的地(destination).

尽管不同的消息系统会提供不同的消息路由模式,但是有两种通用的目的地:队列(queue)和主题(topic).每种类型都与特定的消息模型关联,分别是点对点模型(队列)和发布/订阅模型(主题).

在JMS(Java Message Service)中,有三个主要的参与者:消息的生产者,消息的消费者以及在生产者和消费者之间传递消息的通道(队列或主题).

18 使用WebSocket和STOMP实现消息功能

WebSocket协议提供了通过一个套接字实现全双工通信的功能,最常见的应用场景是实现服务器和基于浏览器的应用之间的通信.

19 使用Spring发送Email

Spring Mail抽象的核心是MainSender接口.

20 使用JMX管理Spring Bean

JMX这项技术能够让我们管理,监视和配置应用

21 借助Spring Boot简化Spring开发

Spring Boot用两个技巧来消除Spring项中的样板式配置:Spring Boot Starter和自动配置.

转载于:https://my.oschina.net/yangyishe/blog/1606655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值