Spring
IOC与DI
- IOC:在Spring框架中实现控制反转的是Spring IoC容器,其具体就是由容器来控制对象的生命周期和业务对象之间的依赖关系,而不是像传统方式(new 对象)中由代码来直接控制。
- DI,依赖注入;IoC和DI其实是同一个概念,只是从不同的角度描述罢了(IoC是一种思想,而DI则是一种具体的技术实现手段)。
- 构造函数注入
- set方法注入
- 注解注入
- 优点
- 第一,资源集中管理,实现资源的可配置和易管理
- 第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
AOP
[[Spring中利用AOP使用自定义注解]] [[Spring AOP注解常见问题]]
Bean
Bean的作用域
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的,对单例设计模式的应用。
- 单例 bean 的线程安全问题
- 单例 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 都有不同的会话。
Bean的生命周期(4个阶段)
- 实例化
- Bean 容器找到配置文件中 Spring Bean 的定义。
- 实例化一个 bean 对象
- 属性赋值
- 为 bean 设置相关属性和依赖
- 初始化
- 初始化前
- 检查Aware相关接口并设置相关依赖【扩展点】
- BeanPostProcessor前置处理【扩展点】
- 初始化
- 是否实现InitializingBean接口【扩展点】
- BeanPostProcessor前置处理后置处理【扩展点】
- 初始化前
- 销毁
- 注册 Destruction相关回调接口【扩展点】
- 使用中
- 是否实现了 DisposableBean 接口,执行 destroy() 方法。【扩展点】
- 如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。 扩展点:
- Aware 接口
- BeanPostProcessor 是 Spring 为修改 bean提供的强大扩展点,其可作用于容器中所有 bean,初始化
- InitializingBean 和 init-method 是 Spring 为 bean 初始化提供的扩展点。
总结一下:
- 4个大的阶段:实例化、属性赋值、初始化、销毁
- 初始化的具体操作,有Aware接口的依赖注入、BeanPostProcessor在初始化前后的处理以及InitializingBean和init-method 的初始化操作
- 销毁的具体操作,有注册销毁回调接口,最后通过 DisposableBean和 destroy-method 实现销毁
Spring启动流程
- 初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
- 实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象
- 实例化BeanDefinitionReader注解配置读取器,用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象,(BeanDefinition 是 Spring 中极其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
- 实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象
- 将配置类的BeanDefinition注册到容器中
- 调用refresh()方法刷新容器
SpringMVC
Spring事务
- Spring 管理事务的方式
- 编程式事务
- 在代码中硬编码(不推荐使用) : 通过 TransactionTemplate或者 TransactionManager 手动管理事务,实际应用中很少使用,但是对于你理解 Spring 事务管理原理有帮助。
- 声明式事务
- 在 XML 配置文件中配置或者直接基于注解(推荐使用) : 实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)
- 编程式事务
事务传播行为
- Spring是什么?
- 谈谈你对AOP的理解
- 面向切面编程
- JDK动态代理
- CGLib动态代理
- 谈谈你对IOC的理解
- 控制反转
- 简单理解:传统开发中,我们在对象内部通过new关键字,创建依赖的对象,我们主动控制依赖的对象;而IoC有专门一个容器来创建依赖对象,对象内部只是被动的接受这些依赖的对象。上面就解释了“控制反转”:依赖对象的获取给反转了。之前,依赖对象由对象内部主动创建获取,现在,依赖对象由容器创建,对象从容器中获取依赖对象。
- 解释下Spring支持的几种bean的作用域
- 5种作用域
- spring事务的实现方式和原理以及隔离级别?
- AOP,4个隔离级别,RU、RC、RR、串行
- 三个问题:
- 幻读:
- 脏读:
- 不可重复读
- Spring事务传播机制
- Spring事务什么时候会失效?
- 什么是bean的自动装配,有哪些方式?
- Spring中的Bean创建的生命周期有哪些步骤
- Spring中Bean是线程安全的吗
- 不是线程安全的
- ApplicationContext和BeanFactory有什么区别
- Spring中的事务是如何实现的
- AOP
- Spring中什么时候@Transactional会失效
- Spring容器启动流程是怎样的
- Spring用到了哪些设计模式
- 工厂设计模式:BeanFactory、ApplicationContext
- 单例模式
- 代理设计模式
- 模板方法:jdbcTemplate、hibernateTemplate
- 观察者模式:ApplicationEvent,ApplicationListener
- 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、SpringMVC中的Controller
- Spring Boot、 Spring MVC 和 Spring 有什么区别