Spring对事件的支持
1)ContextRefreshEvent,当ApplicationContext容器初始化完成或者被刷新的时候,就会发布该事件。
2)ContextStartedEvent,当ApplicationContext启动的时候发布事件,即调用ConfigurableApplicationContext接口的start方法的时候
3)ContextStoppedEvent,当ApplicationContext容器停止的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候
4)ContextClosedEvent,当ApplicationContext关闭的时候发布事件,即调用ConfigurableApplicationContext的close方法的时候,关闭指的是所有的单例Bean都被销毁。
5)equestHandledEvent,只能用于DispatcherServlet的web应用,Spring处理用户请求结束后,系统会触发该事件。
Spring事务隔离级别【2】:
ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它允许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
tips【2】:脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。
幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。
PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
AspectJ:【3】
mybatis工作原理【4】:
1、Configuration
MyBatis所有的配置信息都保存在Configuration对象之中,配置文件的大部分配置都会存储到该类中
2、SqlSession
作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
3、Executor
MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
4、ParameterHandler
负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
5、ResultSetHandler
负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
6、TypeHandler
负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
7、MappedStatement
MappedStatement维护一条
8、SqlSource
负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
9、BoundSql
表示动态生成的SQL语句以及相应的参数信息
占位符 placeholder 的实现原理:
BeanFactoryPostProcessor
接口:它允许我们在容器实例化对象之前,对容器中的BeanDefinition中的信息做一定的修改(比如对某些字段的值进行修改,这就是占位符替换的根本)
PropertyPlaceholderConfigurer:
间接实现了BeanFactoryPostProcessor
接口才完成了占位符的实现
1、postProcessBeanFactory方法里面,mergeProperties();
把加载的所有的 properties 文件中的键值对都取出来保存在一起;
2、生成了一个BeanDefinitionVisitor对象,然后循环遍历 beanFactory 里面的每一个 bean,获取他们的BeanDefinition,然后调用了visitor.visitBeanDefinition(bd);
3、结起来就是找到参数strVal中被#{
和}
包含的部分,然后调用传入的resolver的resolvePlaceholder方法找到对应的值来进行替换(如果有嵌套的会递归替换);
【0】https://blog.csdn.net/liuhouli923914981/article/details/79763814 《Spring 常见的一些面试题整理》
【1】https://www.cnblogs.com/aspirant/p/9082858.html 《BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)》
【2】https://yq.aliyun.com/articles/48893 《Spring五个事务隔离级别和七个事务传播行为》
【3】 https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/ 《Spring AOP 实现原理与 CGLIB 应用》
【4】https://blog.csdn.net/xl_1803/article/details/82492499 《mybatis工作原理》
【5】https://blog.csdn.net/ljc1026774829/article/details/80492996 《Spring 源码解读 | 占位符 placeholder 的实现原理》
【6】https://blog.csdn.net/zl1zl2zl3/article/details/86071240 《面试必问:Spring循环依赖的三种方式》