Spring面试题一网打尽

1.BeanFactory和FactoryBean的区别

BeanFactory

BeanFactory是一个接口也是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,比如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等具体的容器都是对BeanFactory接口的实现,再在其基础之上附加其它的功能。

FactoryBean

FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String beanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&beanNme),在BeanName之前加上&。

  • 隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利.
  • 和设计模式中的工厂模式和修饰器模式相似.

2.Spring-Bean的循环依赖

三级缓存:

1.无法解决构造方法的循环依赖,因为循环依赖的解决必须在构造方法执行完以后。

//单例对象的cache
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//单例对象工厂的cache
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
//提前暴光的单例对象的Cache
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

3.Spring中Bean的五种作用域

  • singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。
  • prototype:为每一个bean请求提供一个实例。
  • request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
  • session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
  • global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。
发布了60 篇原创文章 · 获赞 1 · 访问量 3322

猜你喜欢

转载自blog.csdn.net/qq_16438883/article/details/103678074