- 请说说Spring的核心是什么/有哪些模块(面试真题)
- Spring包含众多模块,Core、Testing、Data Access、Web Servlet…
- 最核心的是Core
- 提供了IOC容器、AOP功能、数据绑定、类型转换等
- IOC
- 控制反转,把new对象的权利交给程序并让其帮助维护对象之间的关系
- AOP
- OOP的补充,统一解决一批组件的共性需求:权限检查、日志、事务等
- 说一说对Spring容器的了解
- BeanFactory
- 基础容器。启动初期速度快,所需资源有限,适合对功能要求不严格的场景
- ApplicationContext
- 高级容器,提供事件发布、国际化信息。要求更多资源
- BeanFactory
- 说一说对BeanFactory的了解
- 是类的通用工厂,创建并管理各种类的对象
- Spring容器的顶层接口
- 说一说对IOC的理解
- 定义见问题1
- 实现
- DI(Dependency Injection)依赖注入是IOC的实现方式
- 三种注入方式
- 构造方法注入
- 在被注入对象构造方法中声明依赖对象的参数列表
- setter方法注入
- 通过setter方法更改响应的对象属性
- 接口注入
- 通过IOC Servie Provider注入,要求必须实现某个接口。IOC Servie Provider通过该接口了解应该注入什么对象
- 构造方法注入
- Spring是如何管理Bean的
- IOC容器,可以通过XML或注解管理
- 管理Bean时常用的注解
- @ComponentScan
- @Conponent
- @Autawired、@Qualifier
- @Scope
- @PostConstruct、@PreDestroy
- 介绍Bean的作用域
- 默认是singleton单例 | 类型 | 说明 | | —- | —- | | singleton | 在Spring容器中仅存在一个实例,即Bean以单例的形式存在。 | | prototype | 每次调用getBean()时,都会执行new操作,返回一个新的实例。 | | request | 每次HTTP请求都会创建一个新的Bean。 | | session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。 | | globalSession | 同一个全局的Session共享一个Bean,一般用于Portlet环境。 |
- 介绍Bean的作用域
说一说Bean的生命周期
- Spring启动,进行Bean的实例化
- Bean属性注入
- 根据是否实现对应接口调用相关方法
- Bean准备就绪
- 销毁
- Spting是怎么解决循环依赖的?
- 三种情况
- 构造器的循环依赖
- Spring处理不了,抛出异常
- 单例模式的setter循环依赖
- 通过三级缓存处理
- 非单例循环依赖
- 无法处理
- 构造器的循环依赖
- 三种情况
- @Autowired和@Resource有什么区别
- @Autowired是Spring提供的注解,@Resource是JDK提供的
- @Autowired按类型注入,@Resource默认按名称,但也支持类型
- @Autowired默认情况要求依赖对象必须存在,可与@Qualifier一起使用;@Resource两个属性name和type,一旦指定name,只能按名称装配
- Spring默认提供的单例模式是安全的吗?
- 不是
- 对AOP的理解
- OOP将程序抽象成不同的层次,AOP将程序抽象成各个切面
- AOP术语
- 连接点
- 对应具体被拦截的对象
- 切点
- 适配连接点
- 通知
- 约定流程下的方法,会织入流程
- 目标对象
- 被代理对象
- 引入
- 引入新的类和方法
- 织入
- 将切点与匹配的连接点拦截,按约定把通知纳入流程
- 切面
- 可以定义切点和各类通知和引入
- 连接点
- 实现方式
- JDK动态代理
- Java提供,在运行时创建接口的代理实例
- CGLib动态代理
- 底层字节码技术,在运行时创建子类代理的实例,目标对象不存在接口时采用
- JDK动态代理
- AOP的应用场景
- 日志、事务处理、权限管理
- Spring AOP不能对哪些类进行增强
- AOP只能对IOC容器中的Bean进行增强
- CGLib不能对final的类代理
- 既然有没有接口都可以用CGLib,那为什么还要有JDK代理
- CGLib创建代理花费的时间较多,JDK适用于需要频繁创建代理对象的场景
- Spring如何管理事务
- 编程式事务
- 麻烦但灵活且事务控制精确
- 声明式事务
- @Transaction
- 编程式事务
Spring的事务传播方式有哪些? | 事务传播类型 | 说明 | | —- | —- | | PROPAGATION_REQUIRED | 如果当前没有事务,则新建一个事务;如果已存在一个事务,则加入到这个事务中。这是最常见的选择。 | | PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,则以非事务方式执行。 | | PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,则抛出异常。 | | PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,则把当前事务挂起。 | | PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,则把当前事务挂起。 | | PROPAGATION_NEVER | 以非事务方式执行操作,如果当前存在事务,则抛出异常。 | | PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
注解@Transactional
- 标注在类上
- 这个类的所以public非静态方法都将开启事务
- 标注在方法
- 该方法开启事务
- 标注在类上