spring的作用:

1:管理对象  IOC+AOP
2:框架/组件的集成

spring的ioc容器是在tomcat启动的时候加载并解析
spring-mvc的ioc容器是在请求第一次到达的时候加载解析

IOC:
一种描述对象如何创建,以及对象之间依赖关系如何形成的技术

spring中提供的两种IOC工厂:
1:BeanFactory的直接实现子类
XmlBeanFactory
2:ApplicationContext的直接实现子类
ClassPathXml  FileSystemxXml  Web

区别:实例化bean的时机不同 
BeanFactory 在getBean()时,实例化指向的Bean
ApplicationContext 解析IOC容器时,一次性将所有的bean全部实例化


AOP:
aop全称 aspect oritened prgramming面向切面编程,是为了弥补OOP编程思想的不足而提出的;
oop在分析一个系统的时候,将整个系统划分成一个个对象,通过对象之间的继承关系实现系统的组装,也就是我们说的面向对象编程;
aop不同,它在分析系统时将系统划分成一个个服务或者二是功能,aop将这些服务划分为两大类:核心业务逻辑+非核心通用服务(权限、事务、异常、安全等),
aop的关注点在非核心通用服务,它将非核心通用服务封装成一个个组件(不再像oop那样分装成object对象),通过在xml中以配置+引用的方式将非核心通用服务添加给需要的核心业务逻辑,从而实现对象的解耦。

WEB:
ContextLoaderListener

MVC:
DispatcherServlet extends HttpServlet


spring-mvc请求处理流程:
客户端提交的hello.do => 提交到web.xml => 被DispatcherServlet拦截 => ioc容器中注册的请求解析器 => 字符?字节? => <context:component-scan> => "/hello" 
=> ioc容器中查找对应的请求处理器 匹配controller requestmapping(path) => 方法返回类型  String、ModelAndView 


事务:
四个特性:
原子性:事务是不可分割的
持久性:要将数据持久化进入数据库
隔离性:事务具有四个隔离级别

一致性:持久化进入数据库中的数据类型不能发生改变


foreach:
    底层使用迭代器实现,允许只读操作,添加删除修改会导致CME(并发修改异常)

volatile:
    volatile关键字修饰的变量在进行写操作的时候回触发两件事情。
      1:将当前处理器缓存行中的数据写到主内存,也就是我们所说的系统内存,也就是物理内存
      2:写回内存的操作导致其他CPU中缓存了该数据地址的数据无效。


      处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。

集合:
  CopyOnWrite : http://ifeve.com/java-copy-on-write/
      是一种程序设计中的优化策略(延时懒惰策略),基本思路就是一开始大家共享同一个内容,当有人想修改这个内容的时候,才会真正的把内容Copy出去一份形成一个新的内容进行修改。
      JDK1.5,CopyOnWriteArrayList||CopyOnWriteSet
      
  Queue : http://blog.csdn.net/paranoia_zk/article/details/72866757
      队列是一种特殊的线性表,遵从FIFO原则,LinkedList实现了Queue接口,完全可以把LinkedList当做队列来使用。

  ConcurrentHashMap : http://www.importnew.com/22007.html


线程:
    
    Thread和Runnable的区别和联系  :http://aijuans.iteye.com/blog/1850109
        实现Runnable接口相比继承Thread类有如下好处:
            1.避免单继承的局限,一个类可以同时实现多个接口
            2.适合资源的共享.
    
    多次start一个线程:
        1:如果是继承了Thread类,直接报错,不允许多次调用start方法
        2:如果是实现了Runnable接口一个线程对象只能启动一个线程,多次start方法,没什么卵用


    synchronized和ReentrantLock的区别:
        http://www.cnblogs.com/fanguangdexiaoyuer/p/5313653.html

    synchronized锁普通方法和锁静态方法:http://topmanopensource.iteye.com/blog/1738178
            所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
        而所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

    死锁的原理及排查方法:

Spring:
    
    Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做:
        通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和...

Session:
    分布式session : ==>   http://blog.csdn.net/u010028869/article/details/50773174?ref=myread

String s = new String("abc");创建了几个String对象?


JAVA中的反射 :http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html


JSON最佳实践