阿里大佬的Spring面试题知识点总结 (二)

201 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

11. Spring IOC 的加载过程

概念态到定义态

  1. 实例化一个Applicationcontext的对象
  2. 调用bean土厂后置处理器完成扫描;
  3. 循环解析扫描出来的类信息,
  4. 实例化一个BeanDefiniti。n对象来存储解析出来的信息;
  5. 把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来以便后面实例化bean;
  6. 再次调用其他bean工厂后置处理器;

定义态到纯净态

  1. 当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用finishBeanFactorylnitialization方法来实例化单例的beam实例化之前spring要做验证,需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototypej是否abstract等等

  2. 如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法,

  3. 推断完构造方法之后spring调用构造方氵去反射实例化一个对象,注意我这里说的是对象、对象、对象,这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean。 从纯净态到成熟态

  4. spring处理合并后的beanDefinition

  5. 判断是否需要完成属性注入

  6. 如果需要完成属性注入,则开始注入属性 初始化

  7. 判断bean的类型回调Aware接口

  8. 调用生命周期回调方法

  9. 如果需要代理则完成代理 创建完成

  10. put到单例池 -> bean完成 -> 存在spring容器中

12.什么是Spring bean? javaBean 和 SpringBean的对象区别

由Spring IOC 容器管理的对象就是Bean。

//对象 bean
UserService bean = applicationContext.getBean(UserService.class);

//对象 JAVA的类就是javaBean
UserService javaBean = new UserService();

13.Spring配置bean的方式

  1. xml: <bean class="com.tuling. Userservice" id=,"">
  2. 注解: @Component、@Controller、@Service、 @Repostory)前提:需要配置扫描包
  3. javaConfig: @Bean
  4. @import

15.Spring Bean 的几种作用域?

Spring 中 Bean 的作用域通常有下面几种:

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的,对单例设计模式的应用。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
  • global-session : 全局 session 作用域,仅仅在基于 portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
  • application : 全局

xml 方式:

<bean id="..." class="..." scope="singleton"></bean>

注解方式:

@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
    return new Person();
}

14. Spring的bean是线程安全的吗?

如果在类中声明变量,且有读写(状态改变),则是不安全的。声明在方法中生明则是安全的。

15. Spring如何处理线程并发问题?

  1. 设置为多例
  2. 将成员变量放在ThreadLocal中
  3. 同步锁,在方法上加上synchronized

16. Spring的生命周期回调方法执行顺序

初始化顺序

执行顺序实现方式方法
1@PostConstruct被注解的方法
2initialzingBeanafterPropertiesSet
3init-method通过配置指定的方法

关闭容器时调用顺序

执行顺序实现方式方法
1@PreDestroy被注解的方法
2DisposableBeandestroy
3destroy-method通过配置指定的方法

总结:注解排头method最后