文章目录
1. 什么是spring:
1. 是个容器,也是个轻量级的javaEE开发应用框架,
2. 核心功能是ioc合aop
2. 什么是ioc:
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,
并且管理这些对象的整个生命周期。
控制反转,对象与对象之间的关系不再由传统的方式管理,而是通过spring进行管理
DI(依赖注入)是他的一个实现。
ioc原理: 通过反射+dom4j解决依赖,
最顶层是BeanFactory接口,起一个约束作用,同时定义了很多方式。
ApplicationContext:是spring的核心配置接口,整个项目运行都依赖于它。管理bean。
源码大概分为几部分:
1. 加载并解析配置文件到BeanDefinition中的map中(map<String, BeanDefinition>)
2. getBean的时候从map中取。
3. aop
思想: 面向切面编程。
那些地方用到:日志,事务。
解决了什么问题:代码重复。
springAop通知有哪些: 前置、后置、环绕、异常
步骤
1. 类上注解@aspect
2. 方法上加对应的注解(@before,@after,@AfterReTuring,@AfterThrowing)。
如:@before("execution(* com.kangyu.userDao.add)")。
内部通过动态代理模式(cglib)来进行处理,
什么是代理模式: 需要对一个类进行加强,然后可以通过代理来进行操作。
代理分为动态代理与静态代理。
静态代理: 需要生成代理类来实现。
动态代理: jdK动态代理(反射来实现),cglib动态代理(通过字节码)。
cglib动态代理: 在运行期间对方法进行增强,依赖于asm包,把被代理对象通过class方式
加载进来,修改其字节码生成子类。
4. bean的生命周期
- >初始化bean
- > bean中的属性赋值
- > 调用BeanNameAware中setBeanName方法
- > 调用BeanFactoryAware中的setBeanFactory
- > 调用ApplicationContextAware中的setApplicationContext
- > BeanPostProcessor中的预处理方法
- > InitializingBean的afterPropertiesSet方法
- > 调用自定义的初始化方法(init-method)方法
- > BeanPostProcessor的后置方法
- > Bean已经加载好了,可以使用了。
- > 容器关闭的时候,DisposableBean中的destory方法
- > 调用自定义的摧毁方法(init-destory)方法。
5. springMvc流程
- > http请求到dispatcherServlet
- > 调用处理器映射器(getHandler)(通过反射的方式找到对应的方法)并返回处理器执行链
- > 通过处理器执行链找到对应的适配器(执行里面的方法内容)
- > 处理器将处理的结构以及跳转的视图封装成modleAndView,并将其返回给适配器。适配器
返回给dispatcherServlet。
- > dispatcherServlet根据modleAndView找到对应的视图解析器
- > 返回view页面给客户端。
6. spring中如何给对象的属性赋值:
构造方法,set
7. 事务
事务的作用: 保证数据的一致性
事务原理:获取数据源的Api,Api中封装了提交回滚等。
可以理解为通过环绕通知(事务开始和事务提交)和异常通知(事务回滚)实现的。
事务特性: 原子性(要么都成功要么…),一致性(A用户向B相互转账100,B要增加100),隔离性(事务之间互不影响),持久性(已经存到数据库里去了)。
事务分类:手动事务、xml事务、声明事务。
spring 事务的传播行为,主要有以下七种:
支持当前事务:
1. 如果当前有事务就用当前事务,否则就用自己的。
2. 如果当前有事务就用当前事务,否则就以非事务运行
3. 如果当前有事务就用当前事务,否则就抛出异常
不支持当前事务
1. 如果当前存在事务,用新事务
2. 如果当前存在事务,不用事务
3. 如果当前存在事务,抛出异常
用这个tx:annotation-driven,然后就可以用@transcation了。
8. 依赖注入注释的方法
主要在配置文件中加入: <context:component-scan>这个注解。 在相应的dao、service加入
@Repository和@service注解即可。
9. Spring事务隔离级别与Mysql InnoDB事务隔离级别的关系
10. spring注解Transactional
rollbackFor:
spring默认的回滚类型是UncheckedException(不可检查异常,也就是运行时异常,包括RuntimeException和Error),如果不改,那么当我们抛出Exception(因为是RuntimeException的爸爸)的时候,事务不会进行回滚
https://www.jianshu.com/p/9098372c108a
11. spring回滚事务
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- throw new RuntimeException()