核心接口
BeanFactory
ApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
WebApplicationContext
XmlWebApplicationContext
AnnotationConfigWebApplicationContext
WebApplicationContextUtils
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
比较
JDK动态代理性能低于CGLib代理
JDK动态代理创建代理对象时比CGLib代理快
如果对象使用的是singleton模式,则建议使用CGLib
增强类型
前置增强(MethodBeforeAdvice):在目标方法前实施增强
后置增强(AfterReturningAdvice):在目标方法执行后实施增强
环绕增强(MethodInterceptor):在目标方法执行前后实施增强
异常抛出增强(ThrowsAdvice):在目标方法抛出异常后实施增强
引介增强(IntroductionInterceptor):在目标类中添加一些新的方法和属性
AspectJ
启用@AspectJ
常用注解
@Aspect:定义某个类为切面
@Before:前置增强
@AfterReturning:后置增强
@Around:环绕增强
@AfterThrowing:异常抛出增强
@After:Final增强,不管是抛出异常还是正常退出,都会执行增强,一般用于释放资源
@DeclareParents:引介增强
切点表达式
方法切点函数
execution()
@annotation()
目标类切点函数
within()
@within()
target()
@target()
不同实现方式对比
优先使用@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为每个线程都提供了一份变量,可以同时访问而互不影响
事务管理
声明式(基于SpringAOP实现)
XML式
1.定义数据源
2.定义事务管理器
3.定义事务增强
4.使用AOP对切面进行事务增强
注解式
1.定义数据源
2.定义事务管理器
3.开启事务注解驱动
4.在类或方法上使用@Transaction注解
不能被SpringAOP实施事务增强的方法
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<ModelAndView>
返回值:WebAsyncTask
返回值:Callable<ModelAndView>
Spring 任务调度
Quartz基础结构
Job
JobDetail
Trigger
SimpleTrigger
CronTrigger
Calendar
Scheduler
ThreadPool
Spring对Executor的抽象
SyncTaskExecutor
SimpleAsyncTaskExecutor
ConcurrentTaskExecutor
SimpleThreadPoolTaskExecutor
ThreadPoolTaskExecutor
TimerTaskExecutor
示例