Spring启动入口:classpathXmlApplicationContext(“bean.xml”);
Spring主要的包:core,beans,aop,expression.
从classpath寻找xml配置文件,根据xml的内容来构建ApplicationContext。
bean的生命周期:实例化-》填充属性-》初始化-》销毁。
脏读:一个事务读取另一个还未提交的事务。
不可重复读:在同一个事务内,多次读同一数据。
幻读:同一个事务查询多次的结果不一样。
事务管理类型:声明式事务,编程式事务。
声明式事务管理要优于编程式事务管理,虽然比编程式事务管理少了一点灵活,只能作用到方法级别,无法像编程式那样做到代码块级别。
如果代理类没有实现InvocationHandler接口,那么Spring AOP会选择CGlib来代理目标类,CGlib是一个代码生成类库,可以在运行时动态生成指定类的子类对象,通过集成做的动态代理。
JDK动态代理机制只能代理实现了接口的类,未实现的就不能代理,CGlib是对类来实现代理的,对目标类生成一个子类,并覆盖其中方法实现增强。
SpringMVC是基于java实现的轻量级的web框架,将web解耦。
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
Synchornized是由JVM实现的一种互斥同步的一种方式,被其修饰的的代码块,在编译前后会被编译器生成了monitorenter和monitorexit两个字节码指令,当执行monitorenter指令时,首先要尝试获取对象的锁,如果当前对象没有锁,或者当前线程已经有了对象的锁,就将锁计数器加一,当执行monitorexit时,锁计数器减一,当计数器为0时,锁就被释放。
锁的本质就是monitorenter和monitorexit字节码指令的一个引用类型的参数,就是要锁的对象和要解锁的对象。
乐观锁缺点:只能保证一个共享变量的原子操作。
CAS长时间不成功就会一直自旋开销大。
ABA的问题(加入数据是A,中间被改为B又改为A)
Reentrantlock比Synchornized的同步操作更加精细,甚至实现了Synchornized没有的高级功能:
比如等待可中断(长期持有锁的线程不释放锁,等待的线程可以不等待)
stampedlock JDK1.8引入的对读写锁的增强,优化了读锁和写锁的访问,同时使读写锁之间可以相互转化,更细粒度的控制并发。
CountDownLatch:是线程完成一个记录一个
CyclicBarrier:等所有的线程完成才执行另一个。
垃圾回收机制:JVM的垃圾回收线程,不用手动去释放对象的内存,当JVM的内存不足或者长时间空闲的时候就会触发,扫描未被引用的对象进行回收。