哈喽大家好,我是小米,一个在互联网行业摸爬滚打多年的程序员,虽然已经 31 岁了,但依然热爱技术分享,尤其是和小伙伴们一起学习进步!
最近春招如火如荼,后台有不少小伙伴私信我:“小米,我去面试 Spring 开发岗位,面试官问我 Spring 框架用了哪些设计模式? 我支支吾吾说了一些,感觉不够全面,怎么办?”
没错,这类问题真的太常见了,尤其是社招面试中,面试官总喜欢考一些既基础又深入的知识点,来判断你对框架的理解深度。所以,今天咱们就来聊聊:Spring 框架中用到了哪些设计模式?
面试官灵魂拷问:Spring 框架中的设计模式
故事要从一个面试场景说起:
小张是个开发工程师,最近在面试一家知名互联网公司。面试官刚开始还挺和蔼,聊了聊项目经历。突然,面试官话锋一转:“你平时用 Spring 吧?说说看,Spring 框架中用了哪些设计模式?”
小张心里咯噔一下,脑子里飞速转动,赶紧把能想到的设计模式往外蹦:“工厂模式、单例模式、代理模式、观察者模式...”
面试官微微一笑:“哦?你能详细说说这些模式是怎么用在 Spring 里的嘛?”
这下小张有点慌了...
工厂模式(Factory Pattern)
我们先来看看小张回答的第一个模式——工厂模式。
1. 模式解读
工厂模式的核心思想是:把对象的创建过程封装起来,用户只需调用工厂方法,而不需要知道对象的创建细节。
2. Spring 中的应用
在 Spring 中,工厂模式可以说是“老江湖”了,主要体现在:
- BeanFactory 和 ApplicationContext 都是典型的工厂模式应用。
- 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!