ApplicationContext与BeanFactory的区别?
BeanFactory是Spring的顶层接口设计,ApplicationContext接口是BeanFactory的子类,具有BeanFactory所有的功能之外,还继承了ResourceLoader(资源加载)/MessageSource(国际化)/ApplicationEventPublisher(事件派发)/EnvironmentCapable(环境配置)等功能
FactoryBean与Bean的区别?
普通Bean注册的对象就是本身。
工厂Bean实现了FactoryBean接口,重写了getObject()。注册的对象不是工厂Bean本身,而是getObject()里面的对象。例如:SqlSessionFactoryBean
1.工厂Bean在spring中一开始保存的是工厂本身对象
2.第一次获取或注入工厂Bean实际对象,会遍历所有BeanDefinitions,找到类型为Bean实际对象
3.遍历中发现是FactoryBean.判断getObjectType()类型是否是要找的Bean实际对象。则返回getObject()创建的对象
4.singletonObjects单实例对象池不会存放getObject()创建的对象,而是放在
Map<String,Object> factoryBeanObjectCache;
InitializingBean:
Bean初始化之后的后续处理,没有传递实例对象。额外的功能处理,不在于改变Bean对象。
BeanPostProcessor与InitializingBean区别?
BeanPostProcessor所有组件都会用到的后置增强
InitializingBean只针对单组件的增强
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:*.xml");
context.getBean();
到底发生了什么?
Spring容器启动完整过程
Spring是如何解决循环依赖?
AOP切面是如何实现的?
SPI机制:
实现工程中 resource/META-INF/services/接口全路径作为文件名
文件内容为实现类全路径
通过ServiceLoader.load(class); 动态得到所有实现类