Spring 设计模式

1. 引言

设计模式是软件开发中的重要组成部分。这些解决方案不仅可以解决反复出现的问题,还可以通过识别常见模式帮助开发人员更好地理解框架的设计。

在本教程中,我们将深入了解 Spring 框架中使用的四种最常见的设计模式:

  1. 工厂方法模式
  2. 单例模式
  3. 代理模式
  4. 模板模式

2.工厂方法模式

在 Spring 框架中,工厂模式用于通过 BeanFactoryApplicationContext 创建 bean 对象。以下是对这两者的对比:

  1. BeanFactory

    • 延迟注入:只有在实际使用到某个 bean 时才会进行注入。
    • 内存占用较少:相较于 ApplicationContext,BeanFactory 占用的内存更少,程序启动速度更快。
    • 基本功能:仅提供了最基本的依赖注入支持。
  2. ApplicationContext

    • 预加载所有 Bean:容器启动时,无论是否实际使用到,都会一次性创建所有的 bean。
    • 功能丰富:在 BeanFactory 的基础上扩展了许多功能,提供了更多的特性和服务。
    • 广泛使用:由于其功能丰富,一般开发人员更倾向于使用 ApplicationContext

ApplicationContext 有三个常用的实现类:

  • ClassPathXmlApplicationContext:将上下文文件作为类路径资源加载。
  • FileSystemXmlApplicationContext:从文件系统中的 XML 文件加载上下文定义信息。
  • XmlWebApplicationContext:从 Web 系统中的 XML 文件加载上下文定义信息。

3.单例模式

使用单例模式的好处 :

  • 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
  • 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。

通常,单例对于应用程序是全局唯一的,但在 Spring 中,此约束被放宽了。相反,Spring 将单个实例限制为每个SpringIOC的一个对象。在实践中,这意味着 Spring 只会为每个应用程序上下文的每种类型创建一个 bean。

Spring 的方法与单例的严格定义不同,因为一个应用程序可以有多个 Spring 容器。因此,如果我们有多个容器,则同一类的多个对象可以存在于单个应用程序中。

Spring 中 bean 的默认作用域就是 singleton(单例)的。 除了 singleton 作用域,Spring 中 bean 还有下面几种作用域:

  • prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。
  • request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
  • session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
  • application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
  • websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。

4.代理模式

AOP(Aspect-Oriented Programming,面向切面编程) 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy 去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理

JDK动态代理和Cglib动态代理的区别:

  • JDK动态代理只能对实现了接口的类生成代理,没有实现接口的类不能使用。
  • Cglib动态代理即使被代理的类没有实现接口,也可以使用,因为Cglib动态代理是使用继承被代理类的方式进行扩展。
  • Cglib动态代理是通过继承的方式,覆盖被代理类的方法来进行代理,所以如果方法是被final修饰的话,就不能进行代理。

5.模板方法模式

模板方法模式: 是一种行为型模式,基于继承的代码复用 定义一个操作的算法骨架,将一些实现步骤延迟到子类中 模板方法使得子类可以不改变一个算法结构的情况下即可重新定义算法的某些特定步骤的实现方式
Spring 中以 Template 结尾的类,比如 jdbcTemplate 等,都是使用了模板方法模式 通常情况下,都是使用继承来实现模板模式 在 Spring 中,使用了 Callback 与模板方法相结合的方式,既达到了代码复用的效果,又增加了系统的灵活性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值