Spring常见问题
# 1.BeanFactory与FactoryBean的区别?
BeanFactory,IOC容器的核心接口,即Bean工厂,BeanFactory会负责创建Bean,并且提供获取Bean的API。
FactoryBean:也是一个接口,通过实现FactoryBean接口,可以创建一个我们自己定义的Bean,这个Bean只会经过Spring的Bean生命周期步骤中的初始化后,其他生命周期步骤不会经过。Spring整合Mybatis的时候,就是通过FactoryBean的方式,将Mybatis中的sql对应的接口转化成Spring的Bean对象。
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。
# 2.BeanFactory与ApplicationContext的区别?
ApplicationContext由BeanFactory派生而来,拥有比BeanFactory更多的功能。
ApplicationContext extends ListableBeanFactory extends BeanFactory (接口之前的继承)
1.支持国际化功能。
2.支持事件机制(发布订阅)。
3.支持底层资源访问,可以用来加载多个Resource。
4.支持web应用。
2
3
4
# 3.Spring整合Mybatis后为什么会导致一级缓存失效?
Mybatis的一级缓存是利用SqlSession实现的,同样的sql,如果在同一个SqlSession执行,就会利用一级缓存,提高查询效率。
Spring整合Mybatis后,执行方法时,如果方法没有加@Transactional注解,那么方法里面执行sql时,每个sql要执行时都会先生成一个新的SqlSession去执行该sql,所以一级缓存会失效。如果加上@Transactional注解,即开启事务,则同个方法内多个sql使用的是同一个SqlSession,从而一级缓存能生效。
# 4.Spring事务失效的原因?
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。