Spring IOC
全称为Inversion of Control,即控制反转,意为把对资源的控制权反转过来,IOC不是一项开发技术,也不是具体功能,而是面向对象编程中的一种设计理念。
IOC的基本概念
- 定义:
- IOC即控制反转,是一种让服务消费者不直接依赖于服务提供者的组件设计方式,通过外部容器来控制组件之间的依赖关系,从而减少类与类之间的直接依赖。
- 原理:
- 在传统的程序设计中,组件之间的依赖关系是由组件自己控制的,即组件向外部请求所需的资源或依赖。而IOC则是将这种控制权反转,由外部容器(如Spring容器)来控制组件之间的依赖关系。
- 容器会负责创建、配置和管理各个组件,并在需要的时候将它们注入到其他组件中。这样,组件只需要声明它们需要哪些依赖,而不需要关心这些依赖是如何被创建和注入的。
- 依赖注入(DI):
- 依赖注入是IOC的一种实现方式,它是指将组件所需的依赖在运行时动态地注入到组件中。通过依赖注入,组件可以更加灵活地获取所需的依赖,而不需要自己创建或查找依赖。
Spring IOC的特点
- 松耦合:Spring IOC通过依赖注入的方式实现了组件之间的松耦合,即组件之间不需要直接依赖具体的实现类,只需要依赖接口或抽象类。这样,当某个组件的实现发生变化时,只需要修改相应的实现类,而不需要修改其他组件的代码。
- 灵活性:Spring IOC提供了多种依赖注入的方式,包括构造函数注入、Setter方法注入和注解注入等。这些注入方式使得开发者可以根据实际需求选择最适合的注入方式。
- 可扩展性:Spring IOC容器支持加载多个配置文件和多个上下文,使得应用程序可以更加灵活地扩展和配置。同时,Spring还提供了丰富的扩展点,如BeanPostProcessor、BeanFactoryPostProcessor等,允许开发者对容器进行自定义扩展。
- 易于测试:由于组件之间的依赖关系被解耦,因此可以轻松地模拟和替换依赖项,从而进行单元测试或集成测试。这使得测试过程更加简单和高效。
第一个Sping程序
实现步骤:
步骤1:下载依赖jar包,并引入项目中。
docs是Spring架构的相关文档,包括API文档、开发手册。
libs是Spring架构中各个模块的jar文件,每个模块均提供三项内容
Spring框架依赖jar包说明如下:
spring-core-5.2.2.RELEASE.jar:Spring框架核心jar包,是其他组件的基本核心,Spring框架的基本核心工具类
spring-beans-5.2.2.RELEASE.jar:包含Spring框架管理Bean和配置文件的基本功能
spring-context-5.2.2.RELEASE.jar:Spring框架核心包的扩展包,包含大量工具类
spring-expression-5.2.2.RELEASE.jar:Spring框架中一个强大的表达式解析语言,支持在运行时动态的解析表达式给对象赋值等功能
步骤2:编写Spring配置文件,在项目的classpath根路径下创建applicationContext.xml文件。为了便于管理框架的配置文件,也可以在项目中创建专门的Source Folder
在Spring配置文件中创建HelloSpring类的实例并为类中的hello属性注入属性值
beans标签中主要包含两部分内容,其中beans标签本身的一些属性如xmlns:xsl等,表示配置文件的一些约束
步骤3:编写测试代码通过Spring进行属性注入,在项目中添加测试方法。
Spring初始化运行环境的几种方式:
(1)除ClassPathXmLApplicationtext外,ApplicationContext
(2)除ApplicationContext及其实现类外,还可以通过BeanFactory接口及其实现类对Bean组件实施管理
Spring AOP
什么是AOP
AOP,全称为Aspect Oriented Programming,即面向切面编程,是一种编程范式,隶属于软件工程范畴。它通过预编译方式和运行期动态代理实现程序功能的统一维护,是OOP(面向对象编程)的延续和补充。AOP主要关注于基于OOP开发中的共性功能,通过横向切割OOP的纵向结构来增强程序的功能,从而提高代码的可重用性、降低业务逻辑各部分之间的耦合度,使业务代码更加简洁且易于维护。
AOP的基本概念
- 切面(Aspect):切面是跨域应用程序多个点的关注点的模块化,如日志记录、事务管理等。切面利用AOP来封装横切关注点,使其与业务逻辑分离。
- 连接点(Joinpoint):在程序执行过程中能够插入切面的点。这些点通常是方法的执行、异常的处理、字段的修改等。
- 切入点(Pointcut):实际上被增强的方法,即被切面所增强的具体连接点。
- 通知(Advice):在特定的连接点上执行的动作,也被称为增强。通知有多种类型,如前置通知、后置通知、环绕通知、异常通知和最终通知。
- 目标对象(Target):被一个或多个切面所增强的对象。
- 代理(Proxy):AOP框架创建的对象,用于实现切面功能的代理。
AOP的优势
- 提高代码的可重用性:通过模块化横切关注点,使得这些关注点可以在多个地方重复使用。
- 业务代码编码更简洁:将横切关注点与业务逻辑分离,使得业务代码更加专注于业务逻辑本身。
- 业务代码维护更高效:当需要修改横切关注点时,只需修改切面代码,而无需修改大量业务代码。
AOP的底层实现
AOP的底层实现通常依赖于动态代理技术。根据被代理对象是否实现了接口,可以选择不同的动态代理方式:
- JDK动态代理:如果被代理对象实现了接口,则可以使用JDK提供的动态代理技术。JDK动态代理通过
java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口实现。 - CGLIB动态代理:如果被代理对象没有实现接口,则可以使用CGLIB(Code Generation Library)库来生成代理类。CGLIB通过继承被代理类来创建代理对象,并在代理对象的方法中织入增强逻辑。
AOP在Spring框架中的应用
Spring框架提供了对AOP的广泛支持,包括基于AspectJ的注解式AOP和基于XML配置的AOP。在Spring中,可以通过@Aspect
注解来定义一个切面,并通过@Before
、@After
、@Around
等注解来定义不同类型的通知。Spring AOP的底层实现也是基于动态代理的,它会自动根据被代理对象是否实现了接口来选择使用JDK动态代理还是CGLIB动态代理。
综上所述,AOP是一种强大的编程范式,它通过横向切割OOP的纵向结构来增强程序的功能,提高代码的可重用性、降低业务逻辑各部分之间的耦合度,并使业务代码更加简洁且易于维护。在Spring框架中,AOP得到了广泛的应用和支持。