文章目录
-
-
-
- 一、Bean 的作用域有哪些?
- 二、单例 Bean 的线程安全问题及解决方案?
- 三、介绍下 Bean 的生命周期?
- 四、什么是 BeanFactory?和 FactoryBean 的区别?
- 五、BeanFactory 和 ApplicationContext 有什么作用?两者之间的区别是什么?
- 六、有几种依赖注入方式?
- 七、注入 Bean 的注解有哪些?@Autowired 和 @Resource 的区别是什么?
- 八、@Autowired 底层原理是什么?
- 九、什么是 AOP?AOP 的使用场景?
- 十、什么情况下 Spring AOP 的动态代理失效?
- 十一、AOP 有哪几种通知?执行顺序分别是什么?
- 十二、Spring 中事务传播行为有哪些?
- 十三、Spring事务如何回滚?
- 十四、Spring 事务管理的具体实现方式和底层原理?
- 十五、Spring 事务失效的情况有哪些?
- 十六、什么是 Spring MVC?
- 十七、SpringMVC 工作原理(请求处理流程)是什么?
- 十八、过滤器和拦截器的区别是什么?
- 十九、SpringBoot启动流程
- 二十、SpringBoot自动装配的原理
- 二十一、SpringBoot 有几种方式读取配置文件?
-
-
一、Bean 的作用域有哪些?
单例singleton、原型prototype、请求request、会话session、全局会话global-session
需要注意的是,只有作用域为 Singleton 的 Bean 由 Spring IOC容器负责管理和维护,而其他作用域的 Bean 需要在适当的时候手动管理其创建和销毁。
二、单例 Bean 的线程安全问题及解决方案?
先了解一下线程安全中有状态、无状态两个概念:1、有状态,就是有数据存储功能并且可读写,线程安全的问题都是由全局变量及静态变量引起的,我们假设每个线程中对全局变量或者静态变量都只可读,那么也就不会存在线程安全问题了;2、无状态,就是不保存数据不存在数据读写问题,当然也就不存在线程安全问题;
解决方案:1、更换 Bean 的作用域为原型模式 @scope("prototype")
;2、使用 ThreadLocal
三、介绍下 Bean 的生命周期?
实例化、属性赋值、初始化、销毁
整个生命周期相关的方法可以分为三大类:Bean自身的方法、容器级生命周期方法、Bean级生命周期方法;
四、什么是 BeanFactory?和 FactoryBean 的区别?
- BeanFactory是一个接口,位于类结构树的顶端,定义了getBean()、containsBean()等管理Bean的通用方法,Spring中有很多BeanFactory的实现类,以此来增强BeanFactory的功能;
- FactoryBean是一个Bean,但不仅仅是一个Bean;它是一个能生产和修饰对象生成的工厂Bean,类似于设计模式中的工厂模式和装饰器模式;它能在需要的时候生产一个对象,返回任何Bean的实例;
五、BeanFactory 和 ApplicationContext 有什么作用?两者之间的区别是什么?
- ApplicationContext 继承自 BeanFactory ,包含 BeanFactory 的所有功能,面向使用 Spring 框架的开发者,几乎所有的应用场合都可以直接使用 ApplicationContext 而非底层的 BeanFactory;
如果说 BeanFactory 是 Spring 的 “心脏”,那么ApplicationContext就是完整的“身躯”了。ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。在 BeanFactory 中,很多功能需要以编程的方式实现,而在 ApplicationContext 中则可以通过配置的方式实现。
我们一般称 BeanFactory 为 IoC 容器,而称 ApplicationContext 为应用上下文。但有时为了行文方便,我们也将 ApplicationContext 称为 Spring 容器。
六、有几种依赖注入方式?
构造函数注入、setter注入、属性注入
七、注入 Bean 的注解有哪些?@Autowired 和 @Resource 的区别是什么?
Spring 内置的 @Autowired
以及 JDK 内置的 @Resource
和 @Inject
都可以用于注入 Bean。
-
@Autowired 是Spring内置的注解,在注入Bean时,它默认通过byType注入(优先根据接口类型),如果该接口存在多个实现类,则通过byName注入(根据属性名),但是这里需要注意,建议通过 结合@Qualifier 注解来显示指定名称而不是依赖变量的名称。
-
@Resource 时JDK内置的注解,与@Autowired刚好相反,它的默认注入方式是byName,如果无法通过名称匹配到对应的Bean注入方式会变为byType。
@Resource
有两个比较重要且日常开发常用的属性:name
(名称)、type
(类型)。如果仅指定 name
属性则注入方式为 byName
,如果仅指定 type
属性则注入方式为