Spring 综述

一、Servlet and JSP

1.Preliinary Topics

(1)What do Web Server and Client do?


(2)URL


(3)Web server单独不能做的

【1】动态内容【2】保存数据到服务器

2.Servlets

(1)Inroduction

Servlets under control of a container


(2)What does the container do?

【1】Communication ssupport【2】LifecycleManagement【3】Multithread Support【4】Declarative security【5】JSP Support
(4)interface servlet and httpServlet
interface Servlet:all servlets must implement this interface ,Servlet的所有方法都是由servlet容器调用的,Servlet要实现get和post方法

3.JSP

JavaServer Pages
复用现有的Java内容,JSP is just a servlet


JSPs用在有小部分变化内容的时候,Servlets用在大部分内容都是变化的时候。

二、Core Spring

1.Spring采用四种策略简化JaVA开发

基于POJO的轻量级、最小侵入式开发;
通过依赖注入和面向接口编程实现松耦合;
通过面向切面编程和惯例实现声明式编程;
通过面向切面编程和模板消除样板式代码;

2.Spring容器

(1)Spring自带了多个容器实现,可以分为两类
BeanFactory:是最简单的容器,提供基本的DI支持,应用上下文
ApplicationContext:基于BeanFactory实现,并提供框架级的服务

3.俯瞰Spring风景线


(1)Spring核心容器,是Spring框架最核心的部分,它管理者Spring应用中Bean的创建,配置和管理
(2)Spring AOP模块,对面向切面编程提供了丰富的支持
(3)数据访问与集成,抽象样板时代码,使数据库代码更简单明了
(4)Web与远程调用

4.Spring Porfolio作品集

【1】Spring web flow【2】Spring web service【3】Spring security【4】Spring Integration
【5】Spring Batch【6】Spring Data【7】Spring Social【8】Spring mobile【9】Spring for android

三、装配Bean

1.Spring配置的可选方案

(1)XML中进行显式配置
(2)在JAVA中进行显示配置
(3)隐式的Bean发现机制和自动装配

2.自动化装备Bean

(1)创建可被发现的Bean
(2)为组件扫描的bean命名
(3)设置组件扫描的基础包
(4)通过为Bean添加注解实现自动装配

3.通过代码装配Bean

(1)创建配置类
(2)声明简单的Bean
(3)借助JavaConfig实现注入
@Bean
public CDPlayer cdPlayer()
{
return new CDPlayer(sgtPeppers());
}

4.环境和Profile

根据环境来选择初始化的Bean
@Profile(“prod”)
@Qualifier(“cold”)
激活Profile,只有被激活了的peofile才会被初始化

5.条件化Bean

假设你希望一个或多个bean只有在应用的类路径下包含特定的库时才创建。或者我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建。我们还可能要求只有特定的环境变量设置之后,才会创建某个bean。

6.处理自动化装配Bean的歧义性


7.Bean的作用域

在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。有时候,可能会发现,你所使用的类是易变的(mutable),它们会保持一些状态,因此重用是不安全的。在这种情况下,将class声明为单例的bean就不是什么好主意了,因为对象会被污染,稍后重用的时候会出现意想不到的问题。
Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
【1】单例(Singleton):在整个应用中,只创建bean的一个实例。
【2】原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
【3】会话(Session):在Web应用中,为每个会话创建一个bean实例。
【4】请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

Spring并不会将实际的ShoppingCart bean注入到StoreService中,Spring会注入一个到ShoppingCart bean的代理,。这个代理会暴露与ShoppingCart相同的方法

8.运行时值注入

有时候硬编码是可以的,但有的时候,我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:
【1】属性占位符(Property placeholder)。
【2】Spring表达式语言(SpEL)。
(1)注入外部的值

(2)使用Spring表达式语言进行装配
SpEL拥有很多特性,包括:
【1】使用bean的ID来引用bean;
【2】调用方法和访问对象的属性;
【3】对值进行算术、关系和逻辑运算;
【4】正则表达式匹配;
【5】集合操作。

四、Spring on the web


1.getting started with Spring MVC


【1】请求离开浏览器,带有用户请求内容的信息,至少包含请求的URL,但是还可能带有其他
【2】首先到达dispatcherServlet,是个前端控制器
【3】DispatherServlet查询一个或多个handler mapping来确定请求的下一站在哪里。
【4】DispatherServlet将请求发送给选中的控制器
【5】请求到达控制器会卸下负载,并等待控制器处理
【6】控制器处理完之后,返回模型和视图名给dispatcherServlet
【7】DispatcherServlet使用视图解析器来将逻辑视图名匹配为一个特定的视图实现
【8】最后一步是视图实现


2.接受请求的输入

(1)查询参数
@RequestParam(“max”) long max;
(2)表单参数
表单会直接注入
(3)路径变量
同(1)

五、Rendering web views

1.creating Velocity views

Velocity是一个模版引擎,可以到
【1】Web应用【2】源码生成【3】自动邮件【4】XML转换
#set( $criteria = ["name", "address"] )

#foreach( $criterion in $criteria )

    #set( $result = $query.criteria($criterion) )

    #if( $result )
        Query was successful
    #end

#end

2.使用Apache Tiles视图定义布局

(1)配置视图解析器

(2)定义Tiles

六、Advanced Spring MVC

1.添加额外的Servlets和filters


2.处理multipart形式的数据
multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制
(1)配置解析器
@Bean //默认
public MultipartResolver multipartResolver() throws IOException {
    return new StandardServletMultipartResolver(); 
} 
还可以限制文件大小类型啥的,不过好像是要在Servlet中配置
3.处理异常
Spring提供了多种方式将异常转换为响应:
【1】特定的Spring异常将会自动映射为指定的HTTP状态码;
【2】异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码;
【3】在方法上可以添加@ExceptionHandler注解,使其用来处理异常。
(1)映射异常到http状态码
@RequestMapping(value="/{spittleId}", method=RequestMethod.GET) 
public String spittle( 
   @PathVariable("spittleId") long spittleId, Model model) { 
       Spittle spittle = spittleRepository.findOne(spittleId); 
       if (spittle == null) { 
            throw new SpittleNotFoundException(); 
       } 
       model.addAttribute(spittle); 
       return "spittle"; 
} 


(2)编写异常处理方法

现在,我们为SpittleController添加一个新的方法,它会处理抛出DuplicateSpittleException的情况:

七、Persisting Data with MyBatis

1.what is mybatis

(1)支持自定义SQL,存储过程和高级映射的类持久化框架
(2)消除几乎所有的JDBC代码和手动设置的参数以及结果的检索
(3)通过XML或注解配置

2.Hibernate

(1)Hibernate基本上可以自动生成。其对数据结构提供了较为完整的封装。
(2)开发效率上,如果使用纯面向对象方式会比较快,但是如果以HQL就和其他方式差不多
(3)可维护方面,MyBatis框架是以SQL的开发方式,可以进行细粒度的优化
(4)hibernate自动生成SQL效果不理想

3.One to One Relationship




4.One TO Many Relationship



5.Mybatis一个强大的特性就是它的动态SQL能力

if when otherwise where set foreach


6.Cache

(1)Mybatis包含一个非常强大的缓存特性。默认是没有开启缓存的。

(2)如果要开启缓存,只需要添加一行<cache/>

(3)cache效果如下

【1】映射语句文件中的所有 select 语句将会被缓存。
【2】映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
【3】缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
【4】根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
【5】缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
【6】缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会 导致冲突。

(4)参数

可用的收回策略有

LRU :最近最少使用

FIFO:先进先出

SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象

WEAK:弱引用,更积极地移除基于垃圾回收器状态和弱引用规则的对象

默认的是LRU

flushinterval:刷新间隔

size:引用数目,默认是1024

ReadOnly只读

八、面向切面的Spring

1. What is aspect-oriented programming?

切面可以帮我们模块化横切关注点

2.AOP的术语

(1)通知(Advice)

【1】前置通知【2】后置通知【3】返回通知【4】异常通知【5】环绕通知


3.Advising controllers为控制添加通知

。控制器通知(controlleradvice)是任意带有@ControllerAdvice注解的类,这个类会包含一个或多个如下类型的
方法:
@ExceptionHandler注解标注的方法;
@InitBinder注解标注的方法;
@ModelAttribute注解标注的方法。
使用@ControllerAdvice,为所有的控制器处理异常

4.Transaction in Spring Spring中的事务



九、网络安全应用和方法

1.Spring Security简介

Spring Security为应用程序提供声明安全保护的安全性框架。能够在web请求级别和方法调用级别处理身份认证和授权。分别使用了依赖注入和面向切面的技术。
(1)启用Web安全性功能的配置




以上的配置会使用默认的configure方法,导致没有人能够进入系统。为了满足要求,需要进行配置

2.配置用户存储

【1】配置用户存储

基于内存的用户存储、基于数据库进行认证、基于LDAP进行认证


【2】指定那些请求需要认真,那些请求不需要认证,以及所需要的权限

【3】提供一个自定义的登录页面,替代原来简单的默认登陆项

3.拦截请求

(1)对每个请求进行细粒度安全性控制的关键在于重载configure(HttpSecurity)方法。如下的代码片段展现了重载的configure(HttpSecurity)方法,它为不同的URL路径有选择地应用安全性:


(1)使用Spring表达式进行安全保护


(2)强制通道的安全性


(3)防止跨站请求伪造

Spring Security通过一个同步token的方式来实现CSRF防护的功能。它将会拦截状态变化的请求(例如,非GET、HEAD、OPTIONS和TRACE的请求)并检查CSRF token。如果请求中不包含CSRF token的话,或者token不能与服务器端的token相匹配,请求将会失败,并抛出CsrfException异常。这意味着在你的应用中,所有的表单必须在一个“_csrf”域中提交token,而且这个token必须要与服务器端计算并存储的token一致,这样的话当表单提交的时候,才能进行匹配。

十、Spring web flow

1.在Spring中配置web flow

(1)装配流程执行器

(2)配置流程注册表

(3)处理流程请求

2.Spring web flow可供选择的状态


十一、缓存

1.使用Redis操作key-value数据

(1)连接到Redis

Spring Data Redis提供了四种连接工厂

JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory

@Bean 
public RedisConnectionFactory redisCF() {
       JedisConnectionFactory cf = new 
              JedisConnectionFactory();
       cf.setHostName(“redis-server”);
       cf.setPort(7379);
       cf.setPassword(“foobared”);
       return cf;
 } 

2.使用Redis Template

(1)SpringData Redis提供了两个模版

RedisTemplate//简化了Redis的数据访问,使持久化各种类型的key和value,并不局限于字节数组
StringRedisTemplate//扩展了RedisTemplate,只关注String类型
@Bean 
public RedisTemplate<String, Product> 
         redisTemplate(RedisConnectionFactory cf) { 
       RedisTemplate<String, Product> redis = new 
            RedisTemplate<String, Product>(); 
       redis.setConnectionFactory(cf);
       return redis; 
}
redis.opsForValue().set(product.getSku(), product);
Product product = redis.opsForValue().get("123456");//简单值
(2)使用key和value的序列化器

当某个条目保存到Redis key-value存储的时候,key和value都会使用Redis的序列化器(serializer)进行序列化。Spring Data Redis提供了多个这样的序列化器,包括:
GenericToStringSerializer:使用Spring转换服务进行序列化;
JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;JSON轻量级的数据交换格式
Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;
JdkSerializationRedisSerializer:使用Java序列化;
OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;
StringRedisSerializer:序列化String类型的key和value。

3.启用对缓存的支持

(1)Spring对缓存的支持有两种方式:
注解驱动的缓存
XML声明的缓存

4.为方法添加注解以支持缓存


十二、Spring消息

1.异步消息简介

没有等待
消息定向与解耦
位置独立性
保证交付

2.基于JMS的消息功能

(1)Java消息服务(Java message service)是一个Java标准,定义了使用消息代理的通用API

【1】Spring通过基于模板的抽象为JMS功能提供了支持,这个模板也就是JmsTemplate

【2】Spring还提供了消息驱动POJO的理念:这是一个简单的Java对象,它能够以异步的方式响应队列或主题上到达的消息。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值