Back

Spring面试题

Spring装配Bean的过程

  1. 实例化;
  2. 设置属性值;
  3. 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name;
  4. 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory;
  5. 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
  6. 调用BeanPostProcessor的预先初始化方法;
  7. 调用InitializingBean的afterPropertiesSet()方法;
  8. 调用定制init-method方法;
  9. 调用BeanPostProcessor的后初始化方法;

springboot的启动过程

  1. 通过 SpringFactoriesLoader加载 META-INF/spring.factories文件,获取并创建 SpringApplicationRunListener对象
  2. 然后由 SpringApplicationRunListener来发出 starting 消息
  3. 创建参数,并配置当前 SpringBoot 应用将要使用的 Environment
  4. 完成之后,依然由 SpringApplicationRunListener来发出 environmentPrepared 消息
  5. 创建 ApplicationContext
  6. 初始化 ApplicationContext,并设置 Environment,加载相关配置等
  7. 由 SpringApplicationRunListener来发出 contextPrepared消息,告知SpringBoot 应用使用的ApplicationContext已准备OK
  8. 将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener来发出 contextLoaded 消息,告知SpringBoot 应用使用的 ApplicationContext已装填OK
  9. refresh ApplicationContext,完成IoC容器可用的最后一步
  10. 由 SpringApplicationRunListener来发出 started 消息
  11. 完成最终的程序的启动
  12. 由 SpringApplicationRunListener来发出 running 消息,告知程序已运行行起来了

spring事件的实现原理,写出常用的几个事件

  • 事件机制:Spring中的事件机制是一个观察者模式的实现.观察者模式就是一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.Spring的事件由ApplicationContext发布。
  • spring默认存在的事件:
    1. ContextStartedEvent:ApplicationContext启动后触发的事件
    2. ContextStoppedEvent:ApplicationContext停止后触发的事件
    3. ContextRefreshedEvent:ApplicationContext初始化或刷新完成后触发的事件
    4. ContextClosedEvent:ApplicationContext关闭后触发的事件

spring中的设计模式

  1. 简单工厂:spring中的BeanFactory就是简单工厂模式的体现,根据传⼊入一个唯一的标识来获得bean对象,但是否是在传⼊参数后创建还是传入参数前创建这个要根据具体情况来定。
  2. 单例模式:Spring下默认的bean均为singleton。
  3. 代理模式:为其他对象提供⼀种代理以控制对这个对象的访问。从结构上来看和Decorator模式类似,但Proxy是控制,更更像是一种对功能的限制,而Decorator是增加职责。 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
  4. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更更新。spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
  5. 模板模式:类似 JdbcTemplate 等则是应用了模板模式。
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus