2021SC@SDUSC
Spring是什么?
Spring是一个轻量级的,开源的,非侵入式的,IOC、AOP的 Java 开发框架,他可以简化企业级应用开发而生。
Spring的优点
轻量级的:Spring框架使用的 jar 包都比较小,核心功能所需的 jar 包总共在3M左右(但其实,由于Spring功能过于强大,要想使用它所有功能,所需要的 jar 包数量也比较多),运行占用的资源少,运行效率高。
非侵入式的:编写一些业务类(是指那些实现我们所需要的功能的类,比如拦截器,过滤器就不是我们这里说的业务类)的代码时,这些业务类不需要继承Spring特定的类,通过一些配置就可以在框架中使用。Spring没有侵入到我们的代码中。
IOC:即 Inversion of Control(控制反转),缩写为 IOC,就是由 Spring 容器管理对象,而非传统实现中由程序代码直接操控。面向接口式编程。使得耦合度降低。(不用Spring的话就是在哪里需要类的对象,就在哪里创建一个,在用了Spring之后,我们不需要自己创建对象了,Spring框架会帮我们管理。我们在用的时候框架会帮我们注入。)把生成对象的控制权反转给Spring框架,这就是 IOC 名字的含义。
AOP:即Aspect Oriented Programming(面向切面编程),是OOP的延续或者是说提升。通过 Spring 提供的 AOP 功能(其实AOP不是Spring独有的,本事就是一种设计思想),方便进行面向切面的编程,使业务逻辑各部分之间的耦合度降低,提高代码的可重用性(公共性(好多地方都能用的到)的代码,我们程序员不用显示的调用它,框架代理我们去调用方法),许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付在 Spring 中,开发人员可以从繁杂的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
一站式框架:Spring本身也提供了数据访问功能和web功能,也可以很好的管理其他框架。涵盖了应用程序开发中的方方面面。
我们在这一次就主要讲关于 IOC 和 AOP 的知识点。
IOC
概述
上文中也提到了,IOC的意思是控制反转。该注意的是,这是一种设计思想,不是一种技术。就是将原来的程序中需要程序员手动创建对象的控制权,交由 Spring 框架来管理。
IOC 容器是具有依赖注入功能的容器,负责对象的实例化、对象的初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制。我们需要使用的对象都由 IOC 容器进行管理,不需要我们再去手动通过 new 的方式去创建对象,由 IOC 容器直接帮我们组装好,当我们需要使用的时候直接从 IOC 容器中直接获取就可以了。
底层实现是,先解析 xml 文件或者扫描注解的方式来获取到需要管理的类,然后通过工厂模式+反射机制来创建对象。然后在使用的时候注入给属性(你声明的那个变量,当然了这个变量也需要注解)就好了,不需要你自己用 new 的方式给属性赋值。
基于 xml 配置方式
Spring IOC 容器管理一个或多个bean,这个 bean 是根据程序员提供给容器的配置元数据创建的。
这些元数据包含了构造Bean定义的一组属性。
id:生成的对象名
class:全类名
name:对象别名,可以为多个
scope:作用域
singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.
prototype:原型,getBean() 的时候都会 new Bean()
request:bean定义被绑定到单个的Http请求生命周期,每次 http 请求都会创建一个 bean,仅在WebApplicationContext环境中有效
session:bean定义被绑定到 Http session 生命周期,同一个 http session 共享一个 Bean,不同 Session 使用不同的 Bean,仅在WebApplicationContext环境中有效
<bean id="bean标识符,也就是名称" class="全类名"></bean>
- 1
Xml 配置方式依赖注入:
指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。
实际上的注入方式有俩种,set 方法注入,构造方法注入。
<bean id="" class="">
<!-- 基于set方法注入,name是属性名,ref是另一个bean的id -->
<property name="" ref=""></property>
<!-- 基于构造方法注入-->
<constructor-arg ref=""/>
</bean>
注解方式
导入注解所需要的 jar 包(编译运行的时候可以认识注解),然后开启注解扫描(编译和运行的时候找一下注解)
以下注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层(数据接收层,处理层,与数据库交互层)使用不同的注解标记。
@Component(value="") //这里的 value 就相当于上面的 id @Service @Repository
注解方式注入属性:
@Autowired
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段(属性)上,那么就不需要再写 setter 方法。默认情况下它要求对象必须存在,也就是不允许属性值为null。如果允许 null 值,可以设置它的 required 属性为 false。
AOP
概述
面向切面编程,这是一种通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术。这里说的是技术,其实也是一种设计思想。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP与OOP(面向对象编程)相比,AOP 是针对业务处理过程中的切面进行提取,它所面对的是某个过程中的某个步骤或阶段。这两种设计思想在目标上有着本质的差异。虽说如此,但是二者还是有联系的,其实,面向切面编程是对面向对象编程的一种补充。
面向切面的好处就是,可以减少重复,专注业务,这里所说的专注业务的意思就是,那些统一的操作,只写一次之后就不用管了,比如验证某些条件(比如,执行所有操作前都需要验证你是否登录,这时就不需要你在所有的操作之前都写一遍验证是否登录的代码)。
包含的基本概念
连接点(Joinpoint):类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut):类中有很多方法可以被增强,但实际中只有 add 和 update被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice):通知是指一个切面在特定的连接点要做的事情(增强的功能)。通知分为方法执行前通知,方法执行后通知,环绕通知等.
切面(Aspect):把通知添加到切入点的过程叫切面.
目标(Target):代理的目标对象(要增强的类)
代理(Proxy):向目标对象应用通知之后创建的代理对象Spring AOP实现
对于 AOP 这种编程思想,很多框架都进行了实现。Spring 就是其中之一,可以完成面向切面编程。
由于,AspectJ 实现了 AOP 的功能,AspectJ 是一个基于 Java 语言的 AOP框架,它提供了强大的 AOP 功能,且其实现方式更为简捷,使用更为方便, 而且还支持注解式开发。所以,Spring 又将 AspectJ 的对于 AOP 的实现也引入到了自己的框架中。在 Spring 中使用 AOP 开发时,一般使用 AspectJ 的实现方式。哈哈,也算是站在巨人的肩膀上了。AspectJ 中常用的通知有五种类型:前置通知(在方法执行之前执行)、后置通知(在方法执行之后执行)、环绕通知(围绕着方法执行)、异常通知(在方法抛出异常之后执行)、最终通知(或者说是返回通知,在方法返回结果之后执行)。