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