春招季面试,Spring 的设计模式考点来了!

0 阅读4分钟



哈喽大家好,我是小米,一个在互联网行业摸爬滚打多年的程序员,虽然已经 31 岁了,但依然热爱技术分享,尤其是和小伙伴们一起学习进步!

最近春招如火如荼,后台有不少小伙伴私信我:“小米,我去面试 Spring 开发岗位,面试官问我 Spring 框架用了哪些设计模式? 我支支吾吾说了一些,感觉不够全面,怎么办?”

没错,这类问题真的太常见了,尤其是社招面试中,面试官总喜欢考一些既基础又深入的知识点,来判断你对框架的理解深度。所以,今天咱们就来聊聊:Spring 框架中用到了哪些设计模式?

面试官灵魂拷问:Spring 框架中的设计模式

故事要从一个面试场景说起:

小张是个开发工程师,最近在面试一家知名互联网公司。面试官刚开始还挺和蔼,聊了聊项目经历。突然,面试官话锋一转:“你平时用 Spring 吧?说说看,Spring 框架中用了哪些设计模式?”

小张心里咯噔一下,脑子里飞速转动,赶紧把能想到的设计模式往外蹦:“工厂模式、单例模式、代理模式、观察者模式...”

面试官微微一笑:“哦?你能详细说说这些模式是怎么用在 Spring 里的嘛?”

这下小张有点慌了...

工厂模式(Factory Pattern)

我们先来看看小张回答的第一个模式——工厂模式

1. 模式解读

工厂模式的核心思想是:把对象的创建过程封装起来,用户只需调用工厂方法,而不需要知道对象的创建细节。

2. Spring 中的应用

在 Spring 中,工厂模式可以说是“老江湖”了,主要体现在:

  • BeanFactoryApplicationContext 都是典型的工厂模式应用。
  • FactoryBean 作为一种特殊的 bean,其核心作用是:创建复杂对象。例如,Spring 集成 MyBatis 时,我们经常会看到 SqlSessionFactoryBean,它就是通过工厂方法来生成 SqlSessionFactory。

3. 场景示例

这个 @Bean 方法本质上就是在使用工厂方法,将复杂的 HikariDataSource 对象创建过程封装起来。

单例模式(Singleton Pattern)

小张回答的第二个模式是单例模式。面试官问:“Spring 中哪里用了单例模式?”

1. 模式解读

单例模式确保一个类只有一个实例,并提供全局访问点。

2. Spring 中的应用

Spring 容器默认的 bean 是 单例模式(singleton) ,即容器中只保留一个共享实例。

单例的生命周期:

  • 容器启动时创建
  • 容器销毁时销毁

3. 场景示例

这个 UserService 在整个 Spring 容器中只有一个实例,所有注入它的地方,实际上都是同一个对象。

代理模式(Proxy Pattern)

面试官听完小张的回答,继续追问:“那代理模式呢?”

1. 模式解读

代理模式指的是:为其他对象提供一种代理以控制对这个对象的访问。

2. Spring 中的应用

Spring AOP(面向切面编程)是典型的代理模式应用。

  • JDK 动态代理: 代理接口
  • CGLIB 动态代理: 代理类本身

3. 场景示例

Spring 在 AOP 实现中使用动态代理对方法进行增强,这样在调用实际方法前,能够先记录日志。

模板方法模式(Template Method Pattern)

面试官点点头:“不错,那模板方法模式呢?”

1. 模式解读

模板方法模式定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。

2. Spring 中的应用

Spring 中,模板方法模式多见于 模板类

  • JdbcTemplate
  • RestTemplate
  • RedisTemplate

3. 场景示例

模板方法模式解耦了复杂操作流程和具体实现,子类可以灵活复用框架定义的算法。

观察者模式(Observer Pattern)

1. 模式解读

观察者模式定义对象间一种一对多的依赖,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。

2. Spring 中的应用

Spring 的 事件驱动模型(ApplicationEvent) 就是观察者模式的经典体现。

3. 场景示例

容器启动时,ContextRefreshedEvent 事件被触发,监听器接收到事件后进行处理。

END

这次面试结束后,小张给我发来消息:“小米!这次我终于把 Spring 中的设计模式讲清楚了,面试官点头认可!”

看吧,其实 Spring 中用到的设计模式不多,关键是理解每个设计模式的核心思想和实际应用场景。如果你能在面试中结合代码和原理来解释,面试官肯定会对你刮目相看!

今天的分享就到这里啦,希望对你有所帮助!如果还有什么面试疑惑,留言告诉我哦!

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!