文章目录
- Spring Framework 中有多少个模块,它们分别是什么?
- 使用Spring框架带来的好处?
- Spring框架中都用到了哪些设计模式?
- 什么是Spring IoC容器?
- 什么是依赖注入?
- IoC和DI有什么区别?
- 可以使用多少种方式完成依赖注入?
- Spring中有多少种IoC容器?
- 常用的BeanFactory容器
- 常用的ApplicationContext容器?
- IoC的好处
- IoC的实现机制?
- 什么是Spring Bean
- Spring有哪些配置方式?
- Spring 支持集中Bean Scope?
- Spring Bean在容器中的生命周期?
- Spring Bean的销毁流程
- 什么是spring的内部bean?
- 什么是spring装配?
- 自动装配有哪些方式?
- 延迟加载
- spring框架中的单例bean是线程安全的么?
- spring bean怎么解决循环依赖问题?
- 什么是AOP?
- 什么是Aspect?
- 什么是JoinPoint?
- 什么是PointCut?
- JoinPoint和PointCut的区别?
- 什么是Advice?
- 有哪些类型的Advice
- 什么是事务?
- 事务的特性指的是?
- spring支持的事务类型?
- spring事务如何和不同的数据持久层框架做集成?
Spring Framework 中有多少个模块,它们分别是什么?
spring核心容器:Core Container
- Spring Core
- Spring Bean
核心容器提供spring的基本功能。
核心容器的主要组件是BeanFactory,它是工厂模式的实现。
BeanFactory使用控制反转(IOC)模式将应用程序的配置
和依赖性规范与实际的应用程序代码分开
- Spring Context
spring上下文是一个配置文件,向spring框架提供上下文信息。
spring上下文包括企业服务。
例如:JNDI\EJB\电子邮件、国际化、事件机制、校验和调度功能
- Spring SpEL
全称为spring expression language,缩写为spel。
能够在运行时构建复杂表达式、存取对象图属性、对象方法调用等。
可以用来配置bean的定义
数据访问:Data Access
该层提供与数据库交互的支持。它包含以下几个模块:
- JDBC
- ORM
- OXM
用于将java对象和xml文件进行映射
- Transction
事务管理:声明式事务和编程式事务
WEB
- WebMVC
MVC是一个全功能构建web应用程序的mvc实现。
通过策略接口,mvc框架变成高高度配置的,容纳了大量视图技术,其中包括JSP、Itext和POI
- WebFlux
- WebSocket
提供一个在web应用中实现高效、双向通讯,需考虑客户端和服务端之间高频和低延迟时信息交互的机制
一般的应用场景有:在线交易、网页聊天、游戏、协作、数据可视化等
AOP
通过配置管理特性,spring aop模块直接将面向方面的编程功能集成到了spring框架中。所以,可以很容易的使spring框架管理的任何对象支持aop
spring aop模块为基于spring的应用程序中的对象提供了事务管理服务。通过使用spring aop,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Aspects
Instrumentation
该层为类检测和类加载器实现提供支持
其他
- JMS
- Test
使用JUnit和TestNG进行测试支持
- Messaging
该模块为STOMP提供支持,支持注解编程模型
使用Spring框架带来的好处?
优点
- DI:使得构造器和Javabean、properties文件中的依赖关系一目了然
- 轻量级:与EJB容器相比,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下,进行应用程序的开发和发布就变得十分有利
- 面向切面编程(AOP):支持切面编程,可以同时把应用的业务逻辑和系统的服务分离开来
- 集成主流框架:比如ORM框架、Logging日志框架、Quartz和JDK Timer,以及其他视图技术
- 模块化:以包和类命名,方便看出所属模块
- 便捷的测试:提供测试类进行开发测试
- Web框架
- 事务管理:提供了便捷的事务管理接口
- 异常处理
缺点
- 每个框架都有问题,调式阶段不直观,不容器判断问题所在。需要花一定时间去理解
- 很多实现都被封装,在满足快速开发的同事,隐藏了实现,导致很多工程师在离开了spring之后,不知道如何工作。
Spring框架中都用到了哪些设计模式?
- 代理模式:aop和remoting中使用较多
- 单例模式:spring配置文件定义的bean默认为单例模式
- 模板方法:用来解决代码重复性问题。比如RestTemplate、JdbcTemplate
- 前端控制器:提供了DispatcherServlet来对请求进行分发
- 工厂模式:BeanFactory用来创建对象的实例
什么是Spring IoC容器?
spring核心是Spring IoC容器。容器创建Bean对象,将它们装配在一起,配置它们并管理它们的完整生命周期
- spring容器使用依赖注入来管理应用程序的Bean对象
- 容器通过读取提供的配置元数据Bean Definition来接受对象进行实例化,配置和组装的指令
- 该配置元数据可以通过XML,java注解或java config代码提供
什么是依赖注入?
在依赖注入中,你不必主动、手动创建对象,但必须描述如何创建它们
IoC和DI有什么区别?
IoC是个更宽泛的概念,DI是更具体的
它是一种将调用者与被调用者分离的思想
可以使用多少种方式完成依赖注入?
- 接口注入
- 构造函数注入
- setter注入(使用较多)
Spring中有多少种IoC容器?
BeanFactory:顶层设计层,就像一个包含Bean集合的工厂类。它会在客户端要求实例化Bean对象
ApplicationContext:用户接口层,继承BeanFactory接口,在其之上提供了一些额外的功能
- MessageSource:管理message,实现国际化等功能
- ApplicationEventPublisher:事件发布
- ResourcePatternResolver:多资源加载
- EnvironmentCapable:系统内环境变量相关
- Lifecycle:管理生命周期
- Closable:关闭,释放资源
- InitializingBean:自定义初始化
- BeanNameAware:设置beanName的Aware接口
applicationContext会自动初始化非懒加载的Bean对象们
两者差异性
BeanFacotry | ApplicationContext |
---|---|
懒加载 | 即使加载 |
语法显示提供资源对象 | 自己创建和管理资源对象 |
不支持国际化 | 支持国际化 |
不支持基于依赖的注解 | 支持基于依赖的注解 |
低级容器 | 高级容器 |
常用的BeanFactory容器
XmlBeanFactory:根据xml文件中定义的内容,创建响应的bean
常用的ApplicationContext容器?
- ClassPathXmlAplicationContext:从classpath的xml配置文件中读取上下文,并生成上下文定义:
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
- FileSystemXmlApplicationContext:由文件系统中的xml配置文件读取上下文:
- XmlWebApplicationContext:由web应用的xml文件读取上下文
- ConfigServletWebServerApplicationContext:spring boot实现获取上下文
IoC的好处
- 最小化应用程序的代码量
- 最小的影响和最少的侵入机制松耦合
- 支持即时实例化和延迟加载bean对象
- 易于测试
IoC的实现机制?
简单来说就是工厂模式+反射机制的实现
什么是Spring Bean
- Bean是由Spring IoC容器实例化,配置,装配和管理
- Bean是基于用户提供给IoC容器的配置元数据BeanDefinition创建
Spring有哪些配置方式?
- xml配置文件
- 注解配置
- Java Config配置
Spring 支持集中Bean Scope?
- singleton:每个spring IoC容器仅有一个单Bean实例。默认配置
- Prototype:每次请求都会产生一个新的实例
- Request:每一次Http请求都会产生一个新的Bean实例,并且该实例仅在当前Http请求内有效
- Session:每一个session都会产生一个新的Bean实例,同时该Bean仅在当前Http session内有效
- Application:每一个Web Application都会产生一个新的Bean,同时该Bean仅在当前Web Application内有效
Spring Bean在容器中的生命周期?
spring bean的初始化流程如下:
- 实例化Bean对象
spring容器根据配置中的Bean Definition中实例化Bean对象
spring使用依赖注入填充所有属性
Bean Definition 可以通过 XML、java注解或java config代码提供
- Aware相关属性,注入到Bean对象
2.1 如果Bean实现了BeanNameAware接口,则工厂通过传递Bean的BeanName来调用setBBeanName(String name) 方法
2.2 如果Bean实现了BeanFactoryAware接口,工厂传递自身的实例来调用setBeanFactory(BeanFactory beanFactory) 方法 - 调用相应的方法,进一步初始化Bean对象
3.1 如果存在于Bean关联的任何BeanPostProcessor,则调用preProcessBeforeInitialization(Object bean,String beanName)方法
3.2 如果Bean实现了InitializingBean接口,则会调用afterPropertiesSet()方法
3.3 如果为Bean指定了init方法,那么将调用这个方法
Spring Bean的销毁流程
- 如果Bean实现DisposableBean接口,当spring容器关闭时,会调用destroy()方法
- 如果为Bean指定destroy方法,那么将调用该方法
什么是spring的内部bean?
只有将bean仅作用另一个bean的属性时,才能将bean声明为内部bean
- spring提供基于xml的配置元数据在中提供
- 内部bean总是匿名的,并且它们总是作为原型prototype
什么是spring装配?
当bean在spring容器中组合到一起时,它被称为装配或bean装配,spring容器需要知道需要什么bean以及容器该如何使用注入来将bean绑定在一起,同时装配bean
自动装配有哪些方式?
spring容器能够自动装配bean,也就是说可以通过检查beanFactory的内容让spring自动解析 bean的协作者。自动装配的不同模式:
- no:默认配置,没有自动装配,应使用显示Bean引用进行装配
- byName:根据bean的名称注入对象依赖项。它匹配并装配其属性与xml文件中由相同名称定义的bean
- byType(常用):根据类型注入对象依赖项,如果属性的类型跟xml文件中的一个Bean类型匹配,则匹配
- 构造函数:通过调用类的构造函数来注入依赖项,它有大量的参数
- autodetect:首先尝试通过构造函数autowire装配,如果不能,则尝试通过byType自动装配
延迟加载
默认情况下,在容器启动之后会将所有作用域为singleton的bean创建好,但是有些场景不需要提前创建好,这是bean中可以设置lzay-init = “true”,容器启动时则不会创建,等需要获取到该bean时,才会进行创建
spring框架中的单例bean是线程安全的么?
- 需开发者自行解决
- 单例bean是否是线程安全的,也不是spring的重点关心问题,spring只需提供根据配置创建单例bean和多里bean的功能
- 大部分的spring bean并没有可变的状态,所以在某程度上可以来说是
线程安全的 - 如果有多状态情况,最简单的解决办法就是改变bean的作用于为prototype
spring bean怎么解决循环依赖问题?
三级缓存
比如有这样的一个依赖关系:A->B->C->A
- 首先A完成初始化第一步并将自己通过ObjectFactory提前曝光出来,在初始化的时候,发现自己依赖对象B,此时会尝试去get(B),这个时候B没有创建出来
- 然后B去初始,同时发现自己依赖C,C也没有创建出来
- 这个时候C又开始进行初始化,但是初始化的过程中发现自己依赖于A,于是尝试get(A),这个时候由于A已经添加到缓存中(一般都是添加至三级缓存singletonFactories),通过ObjectFactory提前曝光,所以可以通过ObjectFactory#getObject()方法来拿到A,C拿到A对象后顺利初始化,然后将自己添加到一级缓存中
- B也可以拿到C对象,完成初始化,A也可以拿到B对象完成初始化,这个时候一整个链路就已经初始化完成了
什么是AOP?
面向切面编程
什么是Aspect?
由PointCut和Advice组成
- 它既包括了横切逻辑的定义,也包括了连接点的定义
- spring aop就是负责实施切面的框架,它将切面所定义的横切逻辑编制到切面所指定的连接点上。
AOP的工作重心在于如何将增强编织目标对象的连接点上,这里包含两个工作: - 如果通过PointCut和Advice定位到特定的JoinPoint上
- 如何在Advice中编写切面代码
什么是JoinPoint?
切点,程序运行中的一些时间点:
- 一个方法的执行
- 一个异常的处理
什么是PointCut?
匹配JoinPoint的条件。
- Advice是和特定的PointCut关联的,并且在PointCut相匹配的JoinPoint中执行。既Advice=>PointCut=>JoinPoint
- 在spring中,所有的方法都可以认为是JoinPoint,但是我们并不需要在所有的方法上都加上Advice。而PointCut的作用,就是提供一组规则来匹配JoinPoint,给满足规则的JointPoint加入Advice
JoinPoint和PointCut的区别?
- spring aop中所有执行的方法都是joinPoint,而PointCut只是一个描述信息,用来匹配JoinPoint,把匹配到的织入Advice
- Advice是在JoinPoint上执行的,而PointCut规定了哪些JointPoint可以执行哪些Advice
什么是Advice?
- 特定JointPoint处的Aspect所采取的动作称为Advice
- Spring AOP使用Advice作为拦截器,在JpinPoint周围维护一些列的拦截器
有哪些类型的Advice
- Before
- After Returning
- After Throwing
- After Finally
- Around
什么是事务?
事务就是对一系列的数据库操作进行统一的提交或者回滚操作,如果插入成功,要么成功,要么一起失败
事务的特性指的是?
ACID:
- 原子性:一个事务中所有的操作,要么全部成功,要么全部失败。
- 一致性:在事务开始和结束前后,诗句哭的完整性没有被破坏。
- 隔离性:允许多个并发事务同时对其进行读取和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致的事务不一致。事务隔离性级别:读未提交,读已提交,可重复读和串行化
- 持久性:事务结束,永久落库,刷入磁盘备份保存
spring支持的事务类型?
- 声明式事务:通过注解或者基于xml的配置事务,从而事务管理和业务代码分离
- 编程式事务:通过编码的方式实现事务管理,需要在代码中显示的调用事务的获取、提交、回滚
spring事务如何和不同的数据持久层框架做集成?
spring有一个PlatformTransactionmanager接口类,里面只有3个方法
- getTransaction()
- commit()
- rollback
所有的持久层框架都会去实现spring的这个接口