前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring常见问题

Spring常见问题

作者头像
OPice
发布2019-11-11 13:10:37
4550
发布2019-11-11 13:10:37
举报
文章被收录于专栏:D·技术专栏D·技术专栏

注:本文只是提供学习,对于知识的一个查漏补缺和解答。不要“知其然而不知其所以然”。融会贯通学会如何使用,而不是纸上谈兵。

1. Spring容器如何创建?

建议:这个问题主要是考察对Spring解析、加载、注册对象的过程。建议看下源码,可以针对XmlBeanFactoryAnnotationConfigApplicationContext两个入口类看起。

:针对XML和注解两种方式的实现分别解释:

1、XML方式,主要流程解析XML获取Resource对象->转换成Document对象(验证模式、解析器) -> 前置、后置处理(空实现) -> 默认标签和自定义标签解析 -> 注册Bean(BeanDefinition),发出事件->完成加载。

2、注解方式,先转换成AnnotatedGenericBeanDefinition-> 解析作用域和注解 -> refresh(); refresh()方法:

(1)prepareRefresh()刷新前的预处理 ——初始化一些属性设置,检验属性合法

(2)obtainFreshBeanFactory获取BeanFactory

(3)prepareBeanFactory BeanFactory的预备工作

(4)postProcessBeanFactory 准备工作完成的工厂后置处理

(5)invokeBeanFactoryPostProcessors 执行postProcessBeanFactory

(6)registerBeanPostProcessors 注册在Bean初始化之前做的一些逻辑

(7)initMessageSource 初始化MessageSource组件

(8)initApplicationEventMulticaster 初始化事件派发器

(9)onRefresh() 留给容器子类实现

(10)registerListeners 注册所有事件Listener

(11)finishBeanFactoryInitialization 初始化所有剩下的单例Bean

(12)finishRefresh ——发出事件,注册Bean

2. Spring的IOC和DI

:IOC和DI只是思想,IOC控制反转;DI依赖注入。

  从本质上出发,Spring为出现,主要解决了什么问题? 如果没有Spring,我们需要一个对象的话,就new Object(),如果要改这个对象我们就要一个个的修改。Spring的IOC容器就是统一将对象管理,需要的话就像容器中拿。所以控制是指的 创建对象的控制权,反转是指的控制权由应用程序转变成Spring控制。

  DI是由于对象的创建管理由Spring来做,那么对象的依赖IOC容器提供所需要的资源。

3. BeanFactory和ApplicationContext区别

:1、ApplicationContext 继承了BeanFactory 2、扩展功能: 在BeanFactory实例化和getBean的基础之上——MessageResource国际化;ResourceLoader访问资源;ApplicationEventPublisher消息发送响应机制;

image.png

4. Spring中Autowired和Resource关键字的区别?

:@Autowired 是Spring提供的注解,是按照类型匹配,可以配合@ Qualifire来通过名称匹配;@Resource是java支持的注解,按照名称匹配。

其中如果一个接口有多个实现,可以使用@Primary来指定使用哪个注入。

5. 依赖注入的方式有几种,各是什么?

:使用setter注入、构造器注入、Field属性注入。

6. Spring容器对Bean组件是如何管理的?

1、创建方式

  • 默认构造函数
  • 静态工厂方法
  • 实例工厂方法

2、作用范围

  • singleton
  • prototype
  • request
  • session
  • globalSession

3、生命周期

参考 7

7. SpringBean的生命周期?Bean是线程安全的吗?

:实例化 -> 初始化前 -> 初始化 -> 初始化后 -> 销毁

image.png

图片来源于Spring容器中Bean的生命周期

单例:共享资源,存在线程不安全问题。

原型:每次使用新创建一个对象,各自持有不会有线程问题

8. Spring的自动装配有哪几种方式?

: 使用autowire 属性

  • no: 不支持
  • default: 默认,由上级标签属性决定
  • byName: 根据名称匹配,实现关联
  • constructor: 通过构造函数
  • byType: 按照类型自动装配 注解对应@Autowired @Qualifier 和@Resource

9. Spring事务分类?传播行为?隔离级别?

:Spring支持

1、编程式事务管理TransactionTemplate

2、声明式事务管理:基于AOP方式;基于AspectJ声明;基于@Transactional注解

传播行为:

事务行为

说明

PROPAGATION_REQUIRED

支持当前事务,假设当前没有事务。就新建一个事务

PROPAGATION_SUPPORTS

支持当前事务,假设当前没有事务,就以非事务方式运行

PROPAGATION_MANDATORY

支持当前事务,假设当前没有事务,就抛出异常

PROPAGATION_REQUIRES_NEW

新建事务,假设当前存在事务。把当前事务挂起

PROPAGATION_NOT_SUPPORTED

以非事务方式运行操作。假设当前存在事务,就把当前事务挂起

PROPAGATION_NEVER

以非事务方式运行,假设当前存在事务,则抛出异常

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

隔离级别:

隔离级别

说明

Isolation.DEFAULT

Spring默认隔离级别,即采用数据库的隔离级别(mysql 默认repeatable、oracle和sql server 默认read_commit)

Isolation.READ_UNCOMMITTED

事务未提交可读,会出现脏读

Isolation.READ_COMMITTED

不可脏读,但会出现幻读和不可重复读

Isolation.REPEATABLE_READ

不可脏读,不可重复读,但会出现幻读

Isolation.SERIALIZABLE

严格按照数据库的事务的ACID四大特性

10. Spring的通知类型有哪些?

前置通知

返回后通知

抛出异常后通知

后通知

环绕通知

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Spring容器如何创建?
  • 2. Spring的IOC和DI
  • 3. BeanFactory和ApplicationContext区别
  • 4. Spring中Autowired和Resource关键字的区别?
  • 5. 依赖注入的方式有几种,各是什么?
  • 6. Spring容器对Bean组件是如何管理的?
  • 7. SpringBean的生命周期?Bean是线程安全的吗?
  • 8. Spring的自动装配有哪几种方式?
  • 9. Spring事务分类?传播行为?隔离级别?
  • 10. Spring的通知类型有哪些?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档