导图社区 《Spring实战》思维导图
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。赶快收藏学起来吧!
编辑于2019-01-28 10:30:44《Spring In Action》 alan notes
Sping的核心
1.Spring之旅
诞生原因:简化Java开发
基于POJO的轻量级和最小入侵性编程
通过依赖注入和面向接口实现松耦合
基于切面和管理进行声明式编程
通过切面和模板减少样板式代码
2.装配Bean
自动化装配bean
组件扫描:Spring会自动发现应用上下文中所创建的bean
@Component 表明该类会作为组件类,并告知Spring要为这个类创建bean
@Named 不太友好,少用
@ComponentScan设置组件扫描的基础包
自动装配:Spring自动满足bean之间的依赖
@Autowired
通过java代码装配bean
为JavaConfig类添加 @Configuration注解
通过XML装配bean
略
导入和混合配置
@Import 导入JavaConfig
@ImportResource 导入XML
3.高级装配
环境与profile
@Profile
条件化的bean
@Conditional 放在@Bean下面 只有当其中的判断条件为true的时候才执行 例如:@Conditional(MagicExistCondition.class)
处理自动装配的歧义性
标示首选的bean
@Primary
限定自动装配的bean
@Qualifier
bean的作用域
单例(Singleton):在整个应用中,只创建bean的一个实例
原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例
会话(Session):在web应用中,为每个会话创建一个bean实例
请求(Request):在web应用中,为每个请求创建一个bean实例
运行时注入
4.面向切面的Spring
AOP术语
通知 active
定义是什么?何时?
前置通知 方法调用前通知
后置通知 完成后输出 不关心返回结果
返回通知 成功执行后调用通知
异常通知 抛出异常通知
环绕通知 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
切点 pointcut
定义何处?
连接点 join point
连接点是在应用执行过程中能够插入切面的一个点
可以是在调用方法时、抛出异常时、修改一个字段时等等
切面 aspect
通知和切点的结合-它是什么,在何时和何处完成其功能
引入 introduction
允许我们向现有的类添加新方法或属性
织入 weaving
把切面应用到目标对象并创建新的代理对象的过程
Web中的Spring
5.构建SpringWeb应用
DispactcherServlet 将请求发送给SpringMVC控制器(Controller)
编写基本控制器
控制器 controller
@Controller 和 @Component其实实现效果是一样的,只是第一个表义更好
@RequestMapping
接受请求的输入
查询参数 Query Parameter
@RequestParams
defaultValue
表单参数 Form Parameter
使用对象接收参数
校验表单
@Valid 指向对象
@NoNull
@Size
等等
路径变量 Path Variable
@PathVariable("XXX")
6.渲染Web视图
JSP
略
Thymeleaf
配置视图解析器
ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf 模板视图;
SpringTemplateEngine:处理模板并渲染结果;
TemplateResolver:加载Thymeleaf模板
定义模板
表单绑定
${}
*{}
前后端分离开发了,就没了详细了解这两门技术了
7.SpringMvc的高级技术
SpringMVC配置的替代方案
自定义DispatcherServlet配置
添加其他的Servlet和Fliter
在web.xml中声明DispatcherServlet
处理multipart形式的数据
配置multipart解析器
CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart请求;
StandardServletMultipartResolver:依赖于Servlet 3.0 对multipart请求的支持(始于Spring 3.1)。
处理multipart请求
<form>标签将enctype属性设置为multipart/form-data,告诉浏览器以multipart数据的形式提交表单。在multipart中,每一个输入域都会对应一个part
添加@RequestPart注解 例如: @RequestPart("profilePicture" byte[] profilePicture) @RequestPart("profilePicture" Part profilePicture) @RequestPart("profilePicture" MultipartFile profilePicture)
处理异常
特定的Spring异常将会自动映射为指定的HTTP状态码;(P264)
异常上可以添加@ResponseStatus注解,从而将其映射为某一个HTTP状态码;
在方法上可以添加@ExceptionHandler注解,使其用来处理 异常。
为控制器添加通知
@ControllerAdvice
@ExceptionHandler
@InitBinder
@ModelAttribute
跨重定向请求传递数据
意义:防止用户点击浏览器的刷新按钮或后退箭头时,客户端重新执行危险的POST请求
通过URL模板进行重定向
使用flash属性
8.使用SpringWebFlow
创建会话式的Web应用程序
定义流程状态和行为
状态
流程中事件发生的地点
转移
连接这些地点的公路
流程数据
流程当前的状态
保护Web流程
<secured>元素实现安全性,该元素会作为这些元素的子元素。 例如:<secured attributes="ROLE_ADMIN" match="all">
9.保护Web应用
SpringSecurity
模块
ACL、Aspects、cas client、configuration、core、cryptog raphy,LDAP,OpenID,Remoting,TagLibray,Web
应用程序类路径至少要包含Core和Configuration两个模块
过滤Web请求
ServletFilter
编写简单的安全性配置
@EnableWebSecurity
extends WebSecurityConfigureAdapter
选择用户认证服务
基于内存存储
重载configure(),传入AuthenticationManagerBuilder
基于数据库进行认证
jdbcAuthentication()
PasswordEncoder接口 密码转码器 (注意是传入密码再加密与数据库比较)
BcryptPasswordEncoder
NoOpPasswordEncoder
StandardPasswordEncoder
LDAP
ldapAuthentication() 轻量目录访问协议
userSearchFilter()
groupSearchFilter()
配置自定义的用户服务
非关系型
1.自定义的UserDetailsService
2.实现loadUserByUsername()方法
3.返回UserDetails
拦截请求
HttpSecurity对象在多个方面配置HTTP的安全性
authorizeRequests() 调用该方法返回的对象的方法来配置请求界别的安全性写解析
antMatchers()指定路径,请求方式认证
anyRequests()所有请求都是允许的
hasRole()配置角色
等等(P324)
reduiresChannel() 为选定的URL强制使用HTTPS
防止跨域
1.同步token的方式来实现CSRF防护
2.不处理 csrf().disable() 禁用
认证用户
configure方法中 fromLogin()
启用HTTP Basic认证
启用Remember-me
保护视图
JSP
Thymeleaf
Spring集成
15.使用远程服务
remote procedure call,RPC
Spring支持的RPC模型
RMI 远程方法调用 不考虑网络限制时(例如防火墙),访问/发布基于Java的服务
弊端1 难以穿透防火墙,其使用任意端口
弊端2 基于Java且使用Java序列化,通信的客户卡端对象必须完全相同
Hessian或Burlap 考虑网络限制时,通过HTTP访问/发布基于Java的服务。Hessian是二进制协议,Burlap是基于XML的
弊端1 如果数据模型非常复查,这两种的序列化模型可能就无法胜任 这个时候建议使用 HTTP invoker
HTTP invoker(调用) 考虑网络限制,并希望使用基于XML或专有的序列化机制实现Java序列化时,访问/发布基于Spring的服务
弊端1 只是一个Spring框架提供的远程调用解决方案,客户端和服务端都把西部基于java且版本需要一致
JAX-RPC 和 JAX-WS 访问/发布平台独立的、基于SOAP的WEB服务
16.使用SpringMVC创建REST API
RPC和REST区别
RPC面向服务,并关注于行为和动作
REST面向资源,强调描述应用程序的事务和名词
REST概念 REST就是将资源的状态以最适合客户端或服务端的形式 从服务端转移到客户端(反之亦然)
Representational 表述性:可以用XML,JSON甚至HTML
State 状态:当使用REST的时候,我们更关注资源的状态而不是对资源采取的行为
Transfer 转移:REST涉及到转移资源数据,它以某种表述性性质从一个应用转移到另一个应用
REST行为
Create:POST
Read:GET
Update:PUT||PATCH
Delete:DELETE
Spring的支持方式
所有HTTP方法:GET,POST,PUT,DELETE,PATCH
@PathVariable处理参数化的URL
借助Spring的视图和视图解析器可以将数据模型渲染为 XML,JSON,Atom以及RSS的View
可以使用ContentNegotiatingViewResolver来选择最适合 客户端的表述;
借助@ResponseBody注解和各种HttpMethodConverter实 现,能够替换基于视图的渲染方式;
@RequestBody注解以及HttpMethodConverter实现 可以将传入的HTTP数据转化为传入控制器处理方法的Java对象;
借助RestTemplate,Spring应用能够方便地使用REST资源
Spring将资源的Java表达形式转换发给客户端的表达形式
内容协商:选择一个视图,它能够将模型渲染为呈现给客户端的表达形式
消息转换器:通过一个消息转换器将控制器锁返回的对象 转为为呈现给客户端的表达形式
HTTP信息转换器
@ResponseBody 将控制器返回的Java对象转换为发送到客户端的资源表述
@RequestMapping 使用produces="application/json" 表面只会接收URL匹配路径和 "aplication/json"的数据
@RestController Spring4.0引入 会为这个类中所有方法添加@ResponseBody
Spring提供自定义相应体,以应对一下特殊情况
@ResponseStatus指定状态码
控制器方法可以返回ResponseEntity对象,该对象能够包含更多相应相关的元数据
异常处理器能够应对错误场景,这样处理器方法就能关注与正常的状况
17.Spring消息
异步消息 客户端不需要等等服务处理消息,即可继续执行
message broker消息代理
destination目的地
队列 queue
点对点消息模型
主题 topic
发布-订阅消息模型
优点
无需等待
面向消息和解耦
位置独立
点对点中 多个服务重一个队列中接收消息,服务压力不足时增加新的服务实例即可
确保投递
使用JMS(JavaMessageService)发送消息 这是Java标准。定义使用消息代理的通用API
ActiveMQ是开源消息代理产品,也是使用JMS进行异步消息传递的最佳选择
AMQP 高级队列 Advanced Message Queuing Protocol
Exchange 间接机制
角色说明
第一步 消息的生产者将信息发布到一个Exchange
第二步 Exchange绑定到一个或多个队列上
第三步 信息的消费者会从队列中提取数据并进行处理
类型
Direct:如果消息的routing key与binding的routing key直接匹配的话,消息将会路由到该队列上
Topic:如果消息的routing key与bingding的routing key符合通配符匹配的话,消息将会路由到该队列上
Headers:如果消息参数表中的头信息和值都与bingding参数表中相匹配,消息将会路由到该队列上
Fanout:不管消息的routing key和参数表的头信息/值是什么,消息将会路由到所有队列上
18.使用WebSocket和STOMP实现消息功能
使用Spring的低层级WebSocket API
WebSocket只是两个应用之间通信的通道。位于WebSocket一端的应用发送消息,另一端处理消息。它是双工的,每一端都可以发送和处理消息。
STOMP
SEND destination:/app/marco content-length:120 {\"message":\"Marco!"\}
19.使用Spring发送Email
配置Spring发送邮件
MailSender接口
构建功夫内容的Email的消息
使用模板生成Email
Velocity Apache提供的通用模板引擎
Thymeleaf 与JSP与Velocity不同,不包含任何特殊的标签库和特有的标签
20.使用JMX管理SpringBean
将Spring bean导出为MBean
远程MBean
处理通知
21.借助SpringBoot简化开发
SpringBootStarter 将常用的依赖组合进行整合,将其合并到一个依赖中,这样可以一次性的添加到项目的Maven和Gradle中
自动配置 SpringBoot的自动配置 特性利用Spring4对条件化配置的支持,合理的推测应用所需的bean并自动化配置它们
命令行接口(Command-Line interface,CLI)
Actuator 为SpingBoot应用添加一定的管理特性
后端中的Spring
10.通过Spring和JDBC征服数据库
Spring数据访问哲学
data access object DAO Repository
Spring的异常体系比JDBC的SQLException丰富得多 并且 持久化机制与数据访问层隔离开
数据访问模块化
模板方法模式 模板方法将过程中与特定实现相关的部分委托给接口, 而这个接口的不同实现定义了过程中的具体行为。
配置数据源
使用JNDI数据源
使用数据源连接池
基于JDBC驱动的数据源
使用嵌入式的数据源
11.使用对象-关系映射持久化数据
Hibernate
Spring与Java持久化API Java Persistence API,JPA
定义查询方法
@Query自定义查询
12.使用NoSQL数据库
使用MongoDB持久化文档数据库
通过注解实现队形-文档映射
使用MongoTemplate实现基于模板的数据库访问
自动化的运行时Repository生成功能
@EnableMongoRepositories
MongoFacoryBean
MongoOperations
使用Neo4J操作图数据
使用Redis操作key-value数据
RedisTemplate
StringRedisTemplate
13.缓存数据
启用对缓存的支持
注解驱动的缓存
@EnableCaching 启用缓存
@Cacheable 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。 如果这个值能够找到,就会返回缓存的值。否则的话,这个方法就 会被调用,返回值会放到缓存之中
@CachePut 表明Spring应该将方法的返回值放到缓存中。在方法的调用前并不会 检查缓存,方法始终都会被调用
@CacheEvict 表明Spring应该在缓存中清除一个或多个条目
@Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解
XML声明的缓存
缓存管理器
Spring框架自带
SimpleCacheManager
NoOpCacheManager
ConcurrentMapCacheManager
CompositeCacheManager
EhCacheCacheManager
SpringData
RedisCacheManager
GemfireCacheManager
14.保护方法应用
使用注解保护方法
SpringSecurity自带的@Secured注解
JSR_250的@RolesAllowed注解
表达式驱动的注解
使用表达式实现方法级别的安全性
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安 全性异常
@PreFilter 允许方法调用,但必须按照表达式来过滤方法的结果
@PostFilter 允许方法调用,但必须在进入方法之前过滤输入值