后端经典面试题合集, Spring 框架中都用到了哪些设计模式?
后端经典面试题合集, Spring 框架中都用到了哪些设计模式?
QA
Step 1
Q:: Spring 框架中使用了哪些设计模式?
A:: Spring 框架中广泛使用了多种设计模式,如:
1.
单例模式(Singleton Pattern):Spring 默认情况下,Bean 是单例的,这意味着在整个 Spring 容器中只有一个 Bean 的实例存在。
2.
工厂模式(Factory Pattern):Spring 的 BeanFactory
和 ApplicationContext
本质上是工厂模式的实现,用于创建和管理 Bean 的实例。
3.
代理模式(Proxy Pattern):AOP(面向切面编程)和声明式事务管理使用了代理模式,通过创建对象的代理来添加额外的功能(如日志记录、事务处理等)。
4.
模板方法模式(Template Method Pattern):Spring 的 JdbcTemplate、RestTemplate 等模板类使用了模板方法模式,通过定义算法的框架并将某些步骤推迟到子类实现。
5.
观察者模式(Observer Pattern):Spring 事件机制使用了观察者模式,允许对象订阅事件并在事件发生时得到通知。
6.
依赖注入(Dependency Injection Pattern):这是 Spring 的核心设计模式,通过构造器、setter 方法或接口注入依赖对象。
Step 2
Q:: Spring 如何实现单例模式?
A:: Spring 框架通过在容器中管理 Bean 的生命周期来实现单例模式。默认情况下,Spring 使用 @Scope('singleton')
注解或在 XML 配置中指定 scope='singleton'
来定义一个 Bean 是单例的。这意味着在 Spring 容器启动时,只会创建一个该 Bean 的实例,并且在整个应用程序中共享这个实例。如果需要非单例的 Bean,可以使用 @Scope('prototype')
。
Step 3
Q:: Spring 中的 AOP 是如何实现的?
A:: Spring 的 AOP 主要通过动态代理来实现:
1.
JDK 动态代理:如果目标类实现了接口,Spring 会使用 JDK 动态代理创建代理对象。
2.
CGLIB 代理:如果目标类没有实现任何接口,Spring 会使用 CGLIB 动态代理,通过生成目标类的子类来创建代理对象。AOP 允许我们在不修改源代码的情况下,动态地将横切关注点(如日志、事务管理)应用到程序中。