目录
(二)大家说spring框架使用三级缓存解决了这个问题,研究一下怎么三级缓存是怎么用的
一、谈谈对spring的理解
spring主要是一个IOC容器,利用它可以创建bean,并且维护管理bean之间关系。同时,它也提供了对aop、web开发、数据库访问、数据持久化、事务等方面的支持,也可以集成一些第三方的框架。它主要有七个模块
1.spring core
2.spring context
3.spring Aop
4.spring web
5.spring mvc
6.spring jdbc
7.spring orm
总之,使用spring可以简化项目的开发。
二、谈谈对aop的理解
思路:aop可以用来做什么,什么是aop,它的实现机制是什么?
为了方便在系统出问题的时候快速找到问题所在,我们想要记录接口调用的日志接口。但是每次调用完接口,就手动记录一个日志的方法太麻烦,而且如果接口日志表里新加了一个字段,我所有的写日志的接口都要改,就很麻烦。要是有人在看到我需要写日志的时候帮我写就好了。把这种对业务无关,但是对多个对象产生影响的行为或者逻辑单独抽取出来进行处理的思想就是AOP。
Aop的实现依赖于代理模式。在目标类初始化的过程中,会在beanpostpropeicessor的后置方法里为它生成一个代理对象。并且把代理对象注入到指定的bean。这样指定的bean在调用方法的时候,实际上是在调用代理对象的方法。比如说JDK动态代理,把这个动态代理类生成到磁盘里,可以看到它在代理类的方法里会调用invocationHandler实现类的invoke方法。在这个invoke方法里,我们可以使用反射机制动态的调用目标对象的方法,并且在方法调用前后做增强处理。这样就达到了切面编程的目的。
三、spring容器使用了那些设计模式
观察者
工厂
单例
适配器
策略
桥接
代理
模板
速记:观察着工厂里有很多单身离异的小姐姐适合婚配,张三想了一个策略,巧借代理出售木板的名义混了进去。
三、谈谈对IOC容器的理解
按照“说文解字”的套路去研究过IOC,控制什么?反转什么?有人说控制指的是获取依赖的方式。反转的是这种方式从主动创建变成被动接收注入。也有人认为ioc的全称叫ioc容器,ioc就是一个容器的描述,或者说是一个名字,就和一个人叫张三、李四一样,没啥意义。主要是它干了意见有意义的事情,就是通过把依赖注入到目标对象,实现了依赖倒置。容器自动帮助我们去创建目标对象和依赖对象,并且把依赖对象注入到目标对象。这样我们直接就可以使用目标对象,岂不是美滋滋?
IOC的容器的一个优点就是可以降低模块质检的耦合度。因为“IOC = 工厂模式+反射+配置文件读取”。这个主要体现在调用的时候,比如说,animal接口有一个sleep()方法,可以使用工厂模式和反射去读取配置文件来创建接口的实例化对象,然后调用方法。要什么动物去实现,我只要在配置文件里改一下就可以了。
四、说一下spring的启动流程
1.入口
基于java-config技术分析源码,入口是 AnnotationConfigApplicationContext.
基于xml技术分析源码,入口是ClassPathXmlApplicationContext
它们俩的共同特征便是都继承了 AbstractApplicationContext 类
// 初始化容器
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
// 注册 Spring 内置后置处理器的 BeanDefinition 到容器
this();
// 注册配置类 BeanDefinition 到容器
register(annotatedClasses);
// 加载或者刷新容器中的Bean
refresh();
}
2.三步走
第一步:将内置的BeanPostProcessor的BeanDefinition注册到容器中去
第二步:将配置类的BeanDefinition注册到容器中去
第三步:调用refresh()方法刷新容器
3.说人话
第一步注册了6个用来解析注解的BeanDefinition
- 注册一个@Configuration配置类解析器的bean定义
- 注册一个@AutoWired配置类解析器的bean定义
- 注册解析@Required 注解的处理器
- 检查是否支持JSR250规范,如何支持注册 解析JSR250规范的注解
- 检查是否支持jpa,若支持注册解析jpa规范的注解
- 注册解析@EventListener的注解
第二步
第三步刷新容器
就是加了一些增强处理
五、说一下bean的生命周期
六、概念理解
beanDefinition
beanFactory
factoryBean
beanPostProcessor
beanFactoryPostProcessor
七、怎么解决循环依赖
(一)什么是循环依赖,怎么个情况?
(二)大家说spring框架使用三级缓存解决了这个问题,研究一下怎么三级缓存是怎么用的
1.bean的生命周期安排一波
2.模拟一下
(三)为啥不用二级缓存啊
八、spring事务的实现方式和实现原理
(二)七个传播机制
|
|
|
支持外层事物 | propagation_required | 有就支持,没有就新建 |
propagation_supports | 有就支持,没有就算了 | |
propagation_mandatory | 有就支持,没有就抛异常 | |
不支持外层事务 | propagation_requires_new | 有就挂起,没有就新建 |
propagation_not_supported | 有就挂起,没有就算了 | |
propagation_never | 有就抛异常 | |
| propagation_nested |
|
- PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。
- PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。
- PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。‘
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
- PROPAGATION_mandatory:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
(三)五种隔离机制
分类 | 脏读 | 不可复读 | 幻读 |
isolation_default |
|
|
|
isolation_read_uncommitted | 可能 | 可能 | 可能 |
isolation_read_committed | / | 可能 | 可能 |
isolation_repeatable_read | / | / | 可能 |
isolation_serializable | / | / | / |