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