导图社区 Spring学习笔记
Sping学习笔记,从任务调度,MVC,缓存,事务管理,AOP,IOC,Web加载方式核心接口分析分类,希望有人用得上。
编辑于2021-02-07 14:01:33Spring学习笔记
优点
1.方便解耦,简化开发
2.AOP编程的支持
3.声明式事务的支持
4.方便程序测试
5.方便集成各种优秀框架
6.降低JavaEE API的使用难度
核心接口
BeanFactory
ApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
WebApplicationContext
XmlWebApplicationContext
AnnotationConfigWebApplicationContext
WebApplicationContextUtils
Web加载方式
ContextLoaderListener
contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener...
DispatherServlet
SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml 0...
Spring IOC
依赖注入
让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖
注入方式
构造函数注入
属性注入
工厂方法注入
接口注入(同属性注入,Spring不支持)
实现原理
使用Java反射技术
反射相关类
ClassLoader
Class
Constructor
Method
Field
类装载器
工作机制
装载:查找和导入Class文件
链接
检验
准备
解析
初始化:对类的静态变量、静态代码块执行初始化工作
ClassLoader
ClassLoader(根装载器):装载JRE目录下的核心类库
ExtClassLoader(扩展类装载器):装载JRE扩展目录ext的JAR类包
AppClassLoader(系统类装载器):装载Classpath路径下的类包
资源访问
Resource
ByteArrayResource
ClassPathResource
FileSystemResource
InputStreamResource
ServletContextResource
UrlResource
EncodedResource
资源地址表达式
classpath:
从类路径中加载,与classpath:/等价
classpath*:
扫描所有类路径下的jar并加载资源
file:
http://
ftp://
没有前缀
Bean作用域
singleton
prototype
request(Web环境特有)
session(Web环境特有)
global session(Web环境特有)
Bean生命周期
BeanFactory中的周期
ApplicationContext中的周期
不同之处
BeanFactory通过手工调用 addBeanPostProcessor 方法注册处理器
ApplicationContext利用Java反射机制自动注册 BeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor 到应用上下文中
JavaBean属性的特殊命名规范
变量的前两个字母要么全部大写,要么全部小写
Spring AOP
面向切面编程
一般只适应于具有横切逻辑的业务上
性能监测
访问控制
事务管理
日志记录
AOP术语
连接点(Joinpoint)
切点(Pointcut)
增强(Advice)
目标对象(Target)
引介(Introduction)
织入(Weaving)
编译期织入
类装载期织入
动态代理织入
注:Spring采用动态代理织入,而AspectJ采用编译期织入
代理(Proxy)
切面(Aspect)
动态代理
基于JDK的动态代理
只提供接口代理
主要类
Proxy
InvocationHandler
基于CGLib的动态代理
提供类代理
比较
JDK动态代理性能低于CGLib代理
JDK动态代理创建代理对象时比CGLib代理快
如果对象使用的是singleton模式,则建议使用CGLib
增强类型
前置增强(MethodBeforeAdvice):在目标方法前实施增强
后置增强(AfterReturningAdvice):在目标方法执行后实施增强
环绕增强(MethodInterceptor):在目标方法执行前后实施增强
异常抛出增强(ThrowsAdvice):在目标方法抛出异常后实施增强
引介增强(IntroductionInterceptor):在目标类中添加一些新的方法和属性
AspectJ
启用@AspectJ
常用注解
@Aspect:定义某个类为切面
@Before:前置增强
@AfterReturning:后置增强
@Around:环绕增强
@AfterThrowing:异常抛出增强
@After:Final增强,不管是抛出异常还是正常退出,都会执行增强,一般用于释放资源
@DeclareParents:引介增强
切点表达式
方法切点函数
execution()
@annotation()
方法入参切点函数
args()
@args()
目标类切点函数
within()
@within()
target()
@target()
代理类切点函数
this()
示例
注解版
@Aspect public class HelloAspect { @Before("execution(* greetTo(..))") public void sayHello() { System.out.println("hello world aspect"); } }
XML版
不同实现方式对比
优先使用@AspectJ注解方式
Spring 事务管理
数据库事务特性(ACID)
原子性(Atomic):表示组成一个事务的多个数据库操作是一个不可分割的原子单元
一致性(Consistency):事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏
隔离性(Isolation):在并发数据库操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰
持久性(Durability):一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中
数据库并发问题
脏读:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作,如果恰巧B事务回滚,那么A事务读取到的数据根本是不被承认的
不可重复读:A事务读取了B事务已经提交的更改数据
幻象读:A事务读取B事务提交的新增数据,幻想读一般发生在计算统计数据的事务中
第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了
第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失
数据库锁机制
解决数据库并发问题
锁分类
行共享锁定
行独占锁定
表共享锁定
表共享独占
表独占
事务隔离级别
read_uncommited(最高并发性和吞吐量)
read_commited
repeatable_read
serializable(最低并发性)
事务传播行为
propagation_required
propagation_supports
propagation_mandatory
propagation_requires_new
propagation_not_supported
propagation_never
propagation_nested
ThreadLocal
当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程 分配一个独立的变量副本。所以每个线程都可以独立地改变自己的副本,而不会影响其他线程 所对应的副本
与Thread同步机制比较
Thread同步仅提供一份变量,让不同的线程排队访问
ThreadLocal为每个线程都提供了一份变量,可以同时访问而互不影响
事务管理
编程式
TransactionTemplate
声明式(基于SpringAOP实现)
XML式
...
1.定义数据源
2.定义事务管理器
3.定义事务增强
4.使用AOP对切面进行事务增强
注解式
一、何处标注@Transaction注解 二、启用注解事务管理 ...
1.定义数据源
2.定义事务管理器
3.开启事务注解驱动
4.在类或方法上使用@Transaction注解
不能被SpringAOP实施事务增强的方法
Spring 缓存
基于注解的支持 Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable、@CachePut 和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,@CachePut主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable不同的是,它每次都会触发真实方法的调用,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。 1.@Cacheable @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,需要注意的是当一个...支
核心接口
Cache
CacheManager
CacheManager的实现
缓存注解
1.@Cacheable :对方法返回结果进行缓存 1.1 value:缓存模块名称(redis数据库中会建立一个表用来存所有与之相关的key),当要清除相关模块所有缓存或指定key缓存时,会从中查找并删除对应的数据 1.2 key:缓存名称,可用使用SpringEL表达式来动态构造名称 1.3 condition:是否使用缓存和是否对返回结果进行缓存的条件(可以使用SpringEL构造表达式) 1.4 unless:是否对结果缓存,当为true时不缓存,false时不缓存(可以使用SpringEL构造条件)(如:【unless = "#result == null || #result.size() == 0"】表示当结果为空或大小为0时不缓存结果) 2.@CacheEvict:清除指定缓存模块所有缓存或指定key的缓存 1.1 value:缓存模块名称 1.2 allEntries:是否清除所有...
@Cacheable
@CachePut
@CacheEvict
@Caching
开启缓存
@EnableCaching
Spring MVC
核心:DispatcherServlet
框架模型
请求处理流程
DispatcherServlet内部逻辑
拦截器
实现接口:HandlerInterceptor
继承类:HandlerInterceptorAdapter
配置
视图解析器
异常处理
DefaultHandlerExceptionResolver:将SpringMVC框架的异常转换为相应的响应状态码
AnnotationMethodHandlerExceptionResolver:通过@ExceptionHandler注解指定处理特定异常的方法
SimpleMappingExceptionResolver:将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
常用注解
@Controller
@RestController
@RequestMapping
@GetMapping @PostMapping @DeleteMapping @PutMapping (4.3版新增)
@RequestBody
@ResponseBody
@RequestParam
@PathVariable
@RequestHeader
@CookieVaule
SpringMVC控制器特性
无参方法
使用HttpServletRequest、HttpServletResponse、HttpSession作为入参
使用InputStream、OutputStream、Reader、Writer作为入参
使用MultipartFile作为入参直接绑定上传的文件
SpirngMVC异步控制器
返回值:DeferredResult
// 第一种异步方式 @GetMapping("/asyncTask1") public DeferredResult asyncTask1() { final DeferredResult deferredResult = new DeferredResult(2000L); // 处理业务 new Thread(new Runnable() { @Override public void run() {...
返回值:WebAsyncTask
// 第二种异步方式 @GetMapping("/asyncTask2") public WebAsyncTask asyncTask2() { // 处理业务 Callable callable = new Callable() { public ModelAndView call() throws Exception { Thread.sleep(3000); //假设是一些长时间任务 ModelAndView model = new ModelAndView("pageView2"); model.addObject("result", "执行成功"); return model;...
返回值:Callable
// 第三种异步方式 @GetMapping("/asyncTask3") public Callable asyncTask3() { return new Callable() { public ModelAndView call() { ModelAndView model = new ModelAndView("pageView3"); model.addObject("result", "执行超时"); return model; } };...
Spring 任务调度
Quartz基础结构
Job
JobDetail
Trigger
SimpleTrigger
CronTrigger
Calendar
Scheduler
ThreadPool
Spring对Executor的抽象
SyncTaskExecutor
SimpleAsyncTaskExecutor
ConcurrentTaskExecutor
SimpleThreadPoolTaskExecutor
ThreadPoolTaskExecutor
TimerTaskExecutor
示例
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">