l 1.对AOP的理解
AOP面向切面是oop思想的一种延伸,将一些与业务无关却又重复的逻辑和行为抽象为一个统一的模块,提高代码复用性和简化管理,如平时的日志和审计等等。
我们平时接触到的有两种,一种是spring aop 和aspectj。spring的过滤器和拦截器是spring aop的一种实现,上一个项目中使用到统计接口调用情况的代码是使用aspectj+注解实现的。
相对于spring aop,aspectj支持更加丰富的joinpoints切入点,并且性能要优于spring aop。另外一个特点就是,aspectj是静态代理,编译时织入增强,而spring aop 则是运行时增强。
spring aop使用的两种动态代理,一种是jdk,还有一种是cglib,jdk需要对象实现了对应接口,而cglib需要对象不是final修饰的。
2、aspectj概念
- 连接点,理论上所有的方法都是连接点,还未被增强、
- 切入点,被增强的方法
- 通知,增加的方式,环绕通知,前通知,后通知,异常后通知,返回通知
- 切面 = 切入点 + 通知
- 织入,增抢的过程
- target ,被增强的目标类
- proxy 增强的代理类
3、IOC和DI
- IOC控制翻转,是将对象的控制权交给spring管理,在开发过程中我们使用一个对象不再需要自己去new,而是spring主动去创建。比如说在service层中需要一个dao层对象获取数据库数据,一般使用注解声明即可。
- DI依赖注入,个人理解为spring在主动提供一系列对象时,这些对象有时需要带有初始化好的属性。
- 三种注入方式:1、构造器注入,2、setter注入,3、注解注入
4、BeanFactory和ApplicationContext
ApplicationContext是BeanFactory的一个子接口,都可以做spring的bean容器。ApplicationContext在BeanFactory的基础上扩展了一些框架的功能,例如国际化,Bean监听等功能。BeanFactory是懒加载的,在getBean的时候才回去创建,而ApplicationContext是一次性加载的,所以在程序启动时就能看到哪些bean加载失败。
5.Bean的生命周期
- 初始化bean
- 依赖注入
- 如果bean实现了Aware接口,bean中会包含对应aware实例
- 如果bean实现了beanPostProcessor会执行initBefore方法
- 如果bean有init-method方法,则执行
- 如果bean实现类beanPostProcessor会执行initAfter方法
- 如果bean实现了DisableBean接口则执行 destroy方法
- 最后执行destroy-method方法
6.类加载机制
类加载分为一下就一个过程
- 加载二进制文件或者jar
- 检验是否符合jvm规范
- 准备阶段分配内存空间
public static int value= 123 ; //变量value在准备阶段过后的初始值是0,不是123.
public static final int value = 123 ; //特殊情况:会生成ConstantValue属性,初始值是123.
- 解析,符号引用转直接引用
- 初始化阶段赋值
7、破坏双亲委托加载模型
Thread.concurrentThread().setClassLoader()
- bootStrap classLoader
- 扩展类加载器
- 应用类加载
- 自定义加载器实现ClassLoader接口
8.springmvc请求流程
DispatcherServlet收到http请求
- 根据请求和HandlerMapping获取执行器链,执行器链中包括拦截器和Handler
- 然后根据获取到的Handler拿到Handler Adapter。
- 在执行handler执行先正序遍执行器链中的拦截器,如果返回false则直接结束
- handlerAdapter执行Handler放回一个ModelAndView
- 拦截器链倒序遍历连接器链执行
- 渲染ModelAndView
9.Filter和Interception执行顺序
filter基于函数回调,Interception基于反射,原则上拦截器动能强于过滤器
10.spring和springmvc的启动
-
spring的启动,web.xml中的ContextLoaderListener监听到启动事件启动Spring,初始化spring的上下文,接着初始化DispatcherServlet也就是SpringMvc的上下文,springMvc会把spring的上下文作为父上下文
-
springmvc的启动流程
springmvc的init由三个类实现
- HttpServletBean重写了init方法,这里会初始化配置文件或者javaConfig中的init-param
- 接着FrameworkServlet初始化上下文
- 最后DispatcherServlet初始化Springmvc的组件
11.spring的事务
- 事务的传播 默认为当前如果没有事务则开启一个新的事务,如果有则加入当前事务
- 事务的隔离级别
- read-uncommitted 一个事务会读取到另外一个事务未提交的结果
- read-committed 一个事务中前后读取同一份数据可能出现不同结果
- repeatable-read 可能会出现虚读或者幻读,虚读注重于结果前后的差异,幻读注重于增删操作
- 串行化
- spring的两种实现形式
- 声明式事务,基于注解
- 编程式事务
12 spring中有哪些事件
- 上下文开始事件
- 上下文更新事件
- 上下文停止事件
- 上下文关闭事件
- 处理web请求结束事件
13 在Mybatis中,mapper接口里的方法能不能被重载
- 不能被重载,mybatis通过jdk的动态代理执行对应方法,而该方法是通过全限定名+方法名保存的,如果重载会导致结果有多个,发生错误
14、mybatis的执行流程
- SqlsessionFactoryBuilder构建一个SqlSessionFactory
- SqlSessionFactory.openSession()
- 执行crud操作
15、mybatis的延迟加载
只对一对一或者一对多情况下有用,一对一使用 association标签,一堆多使用Collection标签
为null时会发起另一次查询
16、mybatis的一二级缓存
一级缓存是session级别的,二级缓存是NameSpace级别的,spring集成mybatis时,二级缓存默认不开启
不建议开启二级缓存的原因是,多表查询情况下会涉及多个namespace,开销大。
17、什么是springboot
springboot是一个能简化配置,快速开发的框架,能避免复杂的配置提高开发效率,能较好的解决依赖冲突,统一管理的javaConfig等。
18,、springboot的自动装配原理
在main方法所在类上的注解@SpringBootApplication中的一个关键注解@EnableAutoConfigration,此注解也是有几个注解组合中,其中的@Import注解中一个XXXselectors类会扫描所有jar的中factoris.properties文件,文件中配置的都是javaConfig配置类,根据一些@ConditionOnXX注解判断是否加载后完成自动装配
19、springboot的配置执行顺序
前面的会覆盖后面的
- SpringBootTest中配置的值
- javaConfig中的值
- 应用程序设置的系统参数,System.set
- 自定义的properties或者yml文件
- jar包里的properties或者yml文件