精通Spring AOP和IOC:原理、应用场景与实战代码示例一网打尽!

news/2025/1/21 10:53:28/

接下来我将详细解释一下Spring AOP和IOC的原理和应用场景。

一、SringAOP

1. Spring AOP的原理和应用场景

Spring AOP是Spring框架中的一个重要组成部分,它是基于代理的面向对象编程技术。在运行时,Spring AOP可以动态地将代码织入到应用程序的特定点,以提供额外的功能,例如日志记录、性能检测等。Spring AOP的实现基于切面(Aspect)和通知(Advice)这两个概念。
切面是类似于日志记录和性能检测等“横切逻辑”的代码片段。它是一个包含通知和切点的Java类,其中通知定义了要执行的逻辑代码,而切点定义了何时执行该代码。
通知是要执行的逻辑代码,Spring AOP提供了以下五种通知类型:

  • 前置通知(Before Advice):在目标方法执行前执行通知代码。
  • 后置通知(After Advice):在目标方法执行后执行通知代码,无论方法是正常执行还是异常退出。
  • 返回通知(After Returning Advice):在目标方法成功执行后执行通知代码。
  • 抛出通知(After Throwing Advice):在目标方法抛出异常后,执行通知代码。
  • 环绕通知(Around Advice):在目标方法执行前后,可以自定义通知代码来代替目标方法的执行。
    Spring AOP通过代理来实现动态织入代码。Spring框架提供了两种代理方式:JDK动态代理和CGLIB代理。对于接口实现类,Spring AOP使用JDK动态代理生成代理对象,对于没有实现接口的类,Spring AOP使用CGLIB代理来生成代理对象。

2.Spring AOP的应用场景包括:

  • 日志处理:记录方法调用日志或错误日志,例如记录用户登录或操作记录。
  • 安全控制:控制用户访问权限,例如控制用户角色或访问URL权限。
  • 声明式事务管理:管理数据库事务,例如声明式地控制事务的开始和提交等操作。

3. Spring AOP的代码示例

首先,定义一个切面类,用于在目标方法执行前后打印日志。

@Aspect
@Component
public class LoggingAspect {private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class);@Before("execution(public * com.example.demo.*.*(..))")public void logBefore(JoinPoint joinPoint) throws Throwable {LOGGER.info("Logging aspect: Before " + joinPoint.getSignature().getName() + " method execution.");}@After("execution(public * com.example.demo.*.*(..))")public void logAfter(JoinPoint joinPoint) throws Throwable {LOGGER.info("Logging aspect: After " + joinPoint.getSignature().getName() + " method execution.");}
}

在上面的代码中,@Aspect注解表示该类是一个切面类,@Before和@After注解分别表示在目标方法执行前和执行后执行通知代码。
接下来,定义一个Service类,用于测试切面类。

@Service
public class UserService {public void addUser(String name) {System.out.println("Adding user: " + name);}public void deleteUser(String name) {System.out.println("Deleting user: " + name);}
}

最后,在Spring配置文件中,配置切面和Service类,并启用AOP功能。

<!-- 开启AOP功能 -->
<aop:aspectj-autoproxy /><!-- 配置切面 -->
<bean id="loggingAspect" class="com.example.demo.LoggingAspect" /><!-- 配置Service类 -->
<bean id="userService" class="com.example.demo.UserService" />

在上面的代码中,<aop:aspectj-autoproxy />标签表示启用AOP功能,标签分别表示配置切面和Service类。

二、SpringIOC

1. Spring IOC的原理和应用场景

Spring IOC是Spring框架中另一个重要的组成部分,它是一种基于接口的编程技术。Spring IOC可以通过依赖注入(DI)来管理对象之间的依赖关系,达到松耦合的效果,让开发人员更容易编写测试和单元测试。
Spring IOC的原理是通过依赖注入(DI)来实现的。依赖注入是一种将对象的依赖关系管理从应用程序代码中移动到Spring配置文件中的技术。Spring框架提供了以下两种基本的依赖注入方式:

  • 基于构造函数的依赖注入:通过构造函数将依赖项注入到目标对象中。
  • 基于Setter方法的依赖注入:通过Setter方法将依赖项注入到目标对象中。
    IOC容器负责创建对象并管理它们的生命周期。对于Spring容器管理的对象,对象实例的创建与销毁以及依赖项的注入都不需要开发人员手动管理。

2.Spring IOC的应用场景包括:

  • 对象创建:通过Spring容器管理对象的创建,例如创建数据源、Hibernate Session以及Service等。
  • 松耦合:通过依赖注入管理对象之间的依赖关系,达到松耦合的效果,让开发者更容易编写测试和单元测试。
  • 配置管理:通过配置文件管理应用程序的配置,例如数据源配置、日志配置等。
    希望这些详细的解释能够更好地帮助你理解Spring AOP和IOC的原理和应用场景。

好的,我将给出一些Spring AOP和IOC的代码示例和注意事项。

3. Spring IOC的代码示例

首先,定义一个Person类,用于测试依赖注入。

@Component
public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}
}

在上面的代码中,@Component注解表示该类为Spring组件,可以由Spring容器管理。
接下来,定义一个Service类,用于测试依赖注入。

@Service
public class PersonService {private Person person;@Autowiredpublic void setPerson(Person person) {this.person = person;}public void printPerson() {System.out.println(person);}
}

在上面的代码中,@Service注解表示该类为Spring服务,@Autowired注解表示使用Setter方法进行依赖注入。
最后,在Spring配置文件中,配置Person类和PersonService类,并启用IOC功能。

<!-- 开启IOC功能 -->
<context:component-scan base-package="com.example.demo" /><!-- 配置Person类 -->
<bean id="person" class="com.example.demo.Person"><property name="name" value="Tom" /><property name="age" value="30" />
</bean><!-- 配置PersonService类 -->
<bean id="personService" class="com.example.demo.PersonService" />

在上面的代码中,<context:component-scan base-package=“com.example.demo” />标签表示启用IOC功能并配置扫描包路径,标签分别表示配置Person类和PersonService类。

4. 注意事项:

  • AOP通知中的切点表达式必须正确,否则无法正确织入代码。
  • 依赖注入时,被注入对象必须在IOC容器中注册为Bean,否则无法进行注入。
  • 基于构造函数的依赖注入和基于Setter方法的依赖注入不能混用,必须选择一种方式进行依赖注入。
  • 在Spring IOC中,单例Bean是默认的,多例Bean必须显示地配置为prototype作用域。

http://www.ppmy.cn/news/51414.html

相关文章

OpenHarmony应用开发-ArkUI方舟开发框架简析

方舟开发框架&#xff08;简称ArkUI&#xff09;为OpenHarmony应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界…

零基础学java——【基础语法】基本输入、输出语句,变量,运算符

目录 变量 数据类型 基本数据类型一览表 声明和初始化 基本的输出、输出语句 输出语句 补充“”的使用 输入语句Scanner 使用步骤 代码演示 运算符 有些内容可能会与c语言作比较 内容借鉴了韩顺平老师的java课堂笔记&#xff08;b站课&#xff09; 变量 数据类型 基本…

【车道线算法】GANet-车道线检测环境配置一文通关

目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub - Wolfwjs/GANet: A Keypoint-based Global Association Network for Lane Detection. Accepted by CVPR 2022 进入代码网址的默认master…

【AI】NVIDIA Jetson系列汇总

1、Jetson系列简介 NVIDIA定义Jetson为适用于新一代自主机器的嵌入式系统。Jetson每个系统都是一个完备的模块化系统 (SOM),具备 CPU、GPU、PMIC、DRAM 和闪存,并且具备可扩展性。 2、Jetson系列族谱 2.1 第一代:TK1 Jetson最早的产品是TK1已属古董,于2014年3月推出 T…

界面交互篇:个人中心页布局样式与逻辑交互开发

微信小程序云开发实战系列-答题积分赛小程序 界面交互篇:个人中心页布局样式与逻辑交互开发 个人中心页效果图 个人中心布局与样式实现 页头布局 在my.wxml中,编写布局代码:

重大剧透:你不用ChatGPT,它砸你饭碗

早晨看到路透社报道&#xff0c;盖茨说&#xff0c;与其争论技术的未来&#xff0c;不如专注于如何更好地利用人工智能。 这可能是他对马斯克他们呼吁暂停AI研发6个月的一种回应吧。 有种古语说&#xff1a;天下大势&#xff0c;浩浩汤汤&#xff0c;顺之者昌&#xff0c;逆之者…

主辅助服务市场出清模型研究【旋转备用】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

P1039 [NOIP2003 提高组] 侦探推理

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…