面试:Spring

1、Spring @Resource、@Autowired的区别
2、在两个不同的线程中通过Spring获取同样id的bean,获取到的是同一个对象还是不同对象?
3、总结Spring Boot Starter的工作原理
4、我们希望一个bean实例被初始化后执行一些逻辑,怎么做?
5、Spring 框架中都用到了哪些设计模式,并举例说明
6、如何解决Spring循环依赖

思考下,或者写一写,再看答案,你一定可以,加油!!!

在这里插入图片描述

1、Spring @Resource、@Autowired的区别

@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;@Autowired默认是按照类型装配注入的;

2、在两个不同的线程中通过Spring获取同样id的bean,获取到的是同一个对象还是不同对象?

考虑了scope,并且答出不同的scope下的结论是同一个对象还是不同对象。

3、总结Spring Boot Starter的工作原理
  1. Spring Boot 在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR
  2. 根据spring.factories配置加载AutoConfigure类
  3. 根据 @Conditional注解的条件,进行自动配置并将Bean注入Spring Context
4、我们希望一个bean实例被初始化后执行一些逻辑,怎么做?

如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
如果Bean实现InitializingBean 执行 afterPropertiesSet
调用 指定初始化方法 init
如果存在类实现 BeanPostProcessor(处理Bean),执行postProcessAfterInitialization

5、Spring 框架中都用到了哪些设计模式,并举例说明

代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
前端控制器—Spring提供了DispatcherServlet来对请求进行分发。
视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。
工厂模式—BeanFactory用来创建对象的实例。

6、如何解决Spring循环依赖

首先什么叫循环依赖,有几种情况:

  1. A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象
  2. A的构造方法中依赖了B的实例对象,同时B的某个field或者setter需要A的实例对象,以及反之
  3. A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象,以及反之

Spring通过三级缓存加上“提前曝光”机制,配合Java的对象引用原理

  1. A首先完成了初始化的第一步,并且将自己提前曝光到singletonFactories中此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程。
  2. B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),由于A通过ObjectFactory将自己提前曝光了,所以B能够通过ObjectFactory.getObject拿到A对象
  3. B拿到A对象后顺利完成了初始化阶段1、2、3,完全初始化之后将自己放入到一级缓存singletonObjects中。此时返回A中,A此时能拿到B的对象顺利完成自己的初始化阶段2、3,最终A也完成了初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值