什么是 Spring

现在在企业应用软件开发中,Java 是毫无急议的主流语言,开放的 Java EE规范和强大的开源框架功不可没,其中 Spring 又是企业软件开发的事实标准之一。接下来,我想聊一下其部分设计细节:Spring Bean 的生命周期和作用域是怎样的?

首先,先来看一下 Spring 的基础机制,至少需要理解下面两个基本方面:

  • 控制反转(Inversion of Control),或者也叫依赖注入(Dependency Injection),广泛应用于 Spring 框架之中,可以有效地改善了模块之间的紧耦合问题。
  • AOP,切面编程机制,Spring 框架中的事务、安全、日志等功能都依赖于 AOP 技术。

第二,Spring 到底是指什么?

前面谈到的 Spring,其实是狭义的 Spring Framework,其内部包含了依赖注入、事件机制等核心模块,也包括事务、O/R Mapping 等功能组成的数据访问模块,以及 Spring MVC 等 Web 框架和其他基础组件。

广义上的 Spring 已经成为了一个庞大的生态系统,例如:

  • Spring Boot,通过整合通用实践,更加自动、智能的依赖管理等,Spring Boot 提供了各种典型应用领域的快速开发基础,所以它是以应用为中心的一个框架集合。
  • Spring Cloud,可以看作是在 Spring Boot 基础上发展出的更加高层次的框架,它提供了构建分布式系统的通用模式,包含服务发现和服务注册、分布式配置管理、负载均衡、分布式诊断等各种子系统,可以简化微服务系统的构建。
  • 当然,还有针对特定领域的 Spring Security、Spring Data 等。

上面的介绍比较笼统,针对这么多内容,如果将目标定得太过宽泛,可能就迷失在 Spring 生态之中,所以还是首先深入你当前使用的模块,比如 Spring MVC。并且,从整体上把握主要前沿框架(如 Spring Cloud)的应用范围和内部设计,至少要了解主要组件和具体用途。

第三,探讨一下更多有关 Spring AOP 自身设计和实现的细节。

首先,我们需要考虑,到底为什么需要切面编程呢?切面编程,其实是为了更好的模块化,而不仅仅是为了减少重复代码。通过 AOP 等机制,可以把横跨多个不同模块的代码抽离出来,让模块本身变得更加内聚,进而业务开发者可以更加专注于业务逻辑本身。从迭代能力上来看,可以通过切面的方式进行修改或者新增功能,这种能力不管是在问题诊断还是产品能力扩展中,都非常有用。

关于 AOP Proxy 的实现原理,它的底层是基于 JDK 动态代理或者 cglib 字节码操纵等技术,运行时动态生成被调用类型的子类等,并实例化代理对象,实际的方法调用会被代理给相应的代理对象。但是,这并没有解释具体在 AOP 设计层面,什么是切面,如何定义切入点和切面行为?

Spring AOP 引入了其他几个关键概念:

  • Aspect,通常叫作方面,它是跨不同 Java 类层面的横切性逻辑。在实现形式上,既可以是 XML 文件中配置的普通类,也可以在类代码中用“@Aspect”注解去声明。在运行时,Spring 框架会创建类似 Advisor 来指代它,其内部会包括切入的时机(Pointcut)和切入的动作(Advice)。
  • Join Point,它是 Aspect 可以切入的特定点,在 Spring 里面只有方法可以作为 Join Point。
  • Advice,它定义了切面中能够采取的动作。Spring 没有在自己的命名空间里定义 Advice、Join Point,这是因为它们是源自 AOP 联盟,可以看作是 Java 工程师在 AOP 层面沟通的通用规范。

具体的 Spring Advice 结构请参考下面的示意图:


Spring Advice 结构.png

其中,BeforeAdvice 和 AfterAdvice 包括它们的子接口是最简单的实现。而 Interceptor 则是所谓的拦截器,用于拦截住方法(也包括构造器)调用事件,进而采取相应动作,所以 Interceptor 是覆盖住整个方法调用过程的 Advice。通常将拦截器类型的 Advice 叫作 Around,在代码中可以使用“@Around”来标记,或者在配置中使用“”。

  • Pointcut,它负责具体定义 Aspect 被应用在哪些 Join Point,可以通过指定具体的类名和方法名来实现,或者也可以使用正则表达式来定义条件。
  • Join Point 仅仅是可利用的机会。
  • 而 Advice 则是明确了切面编程中的做什么;同时通过指定 Before、After 或者 Around,定义了什么时候做。

你可能感兴趣的:(什么是 Spring)