spring面试点

47 阅读3分钟

1 spring

1.1 认识Spring

spring是什么

  • spring是一个生态:可以构建一切基础设置
  • spring是一个轻量级的开源容器框架,为了解决业务代码的耦合问题
  • IOC:控制反转 AOP:面向切面编程 容器:管理对象的生命周期

spring的优缺点

优点: 解耦;ioc;aop;声明式事务;方便集成各种框架,简化Java EE Api的使用

集中管理对象,方便维护对象,不修改代码进行业务增强

缺点:spring框架大而全,使用门槛较高

Spring IOC

把对象的创建管理交给容器,而不是自己直接创建,维护

紧耦合和松耦合

紧耦合: 类之间高度依赖

松耦合:单一职责原则,接口分离原则,依赖导置原则

1.2 Spring Api

BeanFactory

工厂方法顶级接口,通过getBean获取Bean,也是Spring容器(管理Bean的生命周期)

BeanDefinition

负责存储Bean的定义信息,class,是否单例,是否懒加载等等bean的定义信息,后续根据bean的定义信息生产bean

Bean的图纸,决定怎么生产Bean

BeanFactory和ApplicationContext

ApplicationContext不生产Bean,而是通知BeanFactory去生产Bean

ApplicationContext做了更多的事情

  1. 自动注册Bean
  2. 加载环境变量
  3. 支持多语言
  4. 事件监听
  5. 注册对外扩展点
return this.getBeanFactory().getBean(name);

FactoryBean

一个特殊的Bean,由BeanFactory来生产以及管理的

他是一个接口,不能单独存在,必须被一个Bean去实现

通过getObject()方法返回对象,“狸猫换太子”,如果在他前面加一个&可以获得原本的实例,返回的对象变成懒加载

Spring IOC容器的加载过程

  • 概念态: @Bean
  • 定义态:BeanDefinetions
  • 纯净态:class.newInstance
  • 最终态:Object
  1. 创建一个ApplicationContext容器
  2. 调用invokeBeanFactoryPostProcesser,解析配置类,扫描class文件,注册成BeanDefinetion放到Map中
  3. 调用Bean工厂的后置处理器
  4. BeanFactory.getBean, 判断是否符合生产标准
  5. 实例化(反射)--纯静态
  6. 赋值属性--DI的实现
  7. 初始化 --aop,aware,生命周期的回调
  8. 放到Map(单例池)中

Spring IOC有哪些扩展点

  1. BeanDefinitionRegistryPostProcessor:动态注册BeanDefinetion,IOC加载注册Bean定义时机调用
  2. BeanFactoryPostProcessor:IOC加载注册Bean定义时机调用
  3. 在Bean的生命周期内会调用9次bean的后置处理器
  4. 初始化阶段,Aware接口,可以拿到对应的资源(BeanNameAware)
  5. 生命周期的回调:初始化,销毁

单例Bean的优势

spring 默认作用域

作用域: 单例,多例,request,session,application

  1. 减少新生成实例性能消耗,反射Or cglib性能消耗,内存分配的消耗
  2. 减少jvm垃圾回收对象
  3. 从缓存中获取比较快

Spring bean线程安全

单例bean存在线程安全问题

Spring实例化bean的方式

  1. 构造器方法(反射)
  2. 静态工厂方式(配置的factory-method)
  3. 实例化工厂(@Bean)
  4. FactoryBean方式