Spring学习笔记
2020-04-28 16:59:52 0 举报
AI智能生成
spring学习笔记
作者其他创作
大纲/内容
Spring简介
Spring优点
基于POJO的轻量级和最小侵入性编程
基于依赖注入和面向接口实现松耦合
基于切面和惯例进行声明式编程
通过切面和模板减少样板式代码
容器是Spring的核心
bean工厂
提供基本的DI支持
ApplicationContext应用上下文
基于beanFactory构建,提供应用框架级别服务,例如从属性文件解析文本信息以及发布应用事件给事件监听者
Core Container(核心容器)
Core
DeFaultListableBeanFactory介绍
子主题
XMLBeanDefintionReader介绍
子主题
通过继承AbstractBeanDefinitionReader中的方法,来使用Resourloader将资源文件路径转换为对应的Resource文件
通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。
通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Doucument进行解析,并使用BeanDefinitionParserDelegate对Element进行解析。
Beans
IOC(控制反转)/DI(依赖注入)
Spring提供Bean3种装配机制
在XML中进行显示配置
在java中进行显示配置
隐式的bean发现机制和自动装配
Spring从两个角度实现自动装配
组件扫描:Spring会自动发现应用上下文中所创建的bean
自动装配:Spring自动满足bean之间的依赖。
依赖注入
set注入
POJO
XML
测试类
构造器注入
XML
接口注入
P名称空间
Bean的生命周期
Spring对bean进行实例化;
Spring将值和bean的应用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
如果bean实现了beanPostProcessor接口,Spring将调用他们的postProcessBeforeInitialization()方法
如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。同样,如果bean使用destory-method声明了销毁方法,该方法也会被调用。
Context
Spring自带多种类型的应用上下文
AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文
AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文
ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置问价中加载上下文定义,把应用上下文的定义文件作为类资源。
FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
XmlWebApplicationContext:从web应用下的一个或多个XML配置文件中加载上下文定义
Exepression Language
SpEl语言
代码
XML
Data Access(数据访问与集成)
JDBC
DBCP
XML
jdbc.properties
C3P0
xml
jdbc.properties
测试类
Druid(阿里:德鲁伊)
xml
dbconfig.properties
ORM
mybatis
xml
mybatisxml
mapperxml
mapper
实体类
测试类
hibernate+strus2
webxml
applicationContext.xml
hibernate.cfg.xml
struts.xml
jdbc.properties
持久化需求的特性
延迟加载
预先抓取
级联
Spring对ORM框架的支持
支持继承Spring声明式事务
透明的异常处理
线程安全的、轻量级的模板类
DAO支持类
资源管理
OXM
JMS
Transaction
事务简介
事务就是一组由于逻辑上紧密关联而合并成一个整体的多个数据库操作,这些操作要么都执行,要么都不执行。
事务四个特性(ACID)
原子性(Atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)
事务传播属性
事物的隔离级别
数据库事务并发问题
脏读
不可重复读
幻读
隔离级别
读未提交(READ UNCOMMITTED)
允许transaction01读取transaction02未提交的修改
读已提交(READ COMMITTED)
允许transaction01只能读取transaction02已提交的修改
可重复读(REPEATABLE READ)
确保transaction01可以从一个字段中读取到相同的值,即transaction01执行期间禁止其他事务对这个字段进行更新
串行化(SERIALIZABLE)
确保transaction01可以多次从一个表中读取到相同的行,在transaction01执行期间禁止其他事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。
各个隔离级别解决并发能力
各个数据库对事务级别的支持程度
事务配置文件
设置途径
注解
XML
Aop(面相切面编程)
Aspects
基于注解
代码
xml
测试类
子主题
基于XML
代码
xml
测试类
子主题
AOP术语
advice通知
前置通知(before)
在目标方法被调用之前调用通知功能
后置通知(after)
在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知(after-returning)
在目标方法成功执行之后调用通知
异常通知(after-throwing)
在目标方法抛出异常之后调用通知
环绕通知(around)
通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义行为
连接点(join point)
我们应用可能有数一千个应用通知,这些时机被称为连接点。连接点是应用执行过程中能够插入切面的一个点
切点(poincut)
如果说通知定义了切面“什么”和“何时”的话,那么切点就定义了“何处”,切点的定义会匹配通知所要的织入的一个或多个连接点
切面(aspect)
切面是通知和切点的结合。
引入(introduction)
引入允许我们向现有的类添加新方法或属性
织入(weaving)
织入就是把切面应用到目标对象并创建新的代理对象的过程
在对象的生命周期中有多个点可以织入
编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的
类加载期
切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(classLoader),它可以在目标类被引入应用之前增强该目标类的字节码
运行期
切面在应用运行的某个时刻被织入。一般情况下,在织入切面是,AOP容器会为目标对象动态创建一个代理对象。SpringAOP就是以这种方式织入切面的
Spring提供了4中类型的AOP支持
基于代理的经典SpringAOP
纯POJO切面
@Aspect注解驱动的切面
注入式AspectJ切面
切面图
AspectJ指示器
XML声明切面
编程范式概览
面相过程编程
面相对象编程
函数式编程
事件驱动编程
面相切面编程
AOP应用场景
权限控制
缓存控制
事务控制
审计日志
性能监控
分布式追踪
异常处理
Web(web与远程调用)
Web
请求图
子主题
上图介绍
请求离开浏览器
请求进入DispacherServlet
DispacherServlet发送请求给控制器
请求指定控制器
请求返回DispatcherServlet
DispatcherServlet找到视图
视图将模型数据渲染
Web-servlet
Web-Struts
Web-Porlet
Instrumentation
Test(测试)
没有用test测试类
使用test测试类
Spring常用注解
@Autowired
自动装备,其作用是为了消除代码java代码里面的getter/setter与bean属性中的property
@controller
控制器(注入服务)
@service
服务(注入dao)
@repository
dao(实现dao访问)
@component
把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Scope
用来指定bean的作用域
@Resource
@PostConstruct
@PreDestroy
@responseBody
@Transactional
@RequestMapping
value, method
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
可以指定为普通的具体值
可以指定为含有某变量的一类值
@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
可以指定为含正则表达式的一类值
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
params,headers
params: 指定request中必须包含某些参数值是,才让该方法处理。
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")
0 条评论
下一页