Java/Spring/SpringBoot边用边学系列一

依赖注入

依赖注入(Dependency Injection,DI)是一种设计模式或技术,用于解耦和管理对象之间的依赖关系。它是通过将对象的依赖关系交给容器或框架来管理,而不是在代码中直接创建和管理依赖对象。

在依赖注入中,对象不再负责创建或查找它所依赖的对象,而是通过外部的机制将依赖对象注入到目标对象中。这样可以降低对象之间的耦合度,使得对象更加独立、可测试和可复用。

@Resource

@Resource 注解的实现逻辑主要包括注解处理器的扫描、依赖对象的查找、创建和注入,以及依赖对象的生命周期管理。容器或框架会根据注解的指定信息,在合适的时机创建和注入依赖对象,并负责管理其生命周期。不同的容器或框架对 @Resource 注解的实现逻辑可能会有所不同,但核心的原理和流程是相似的。

@RestController

@RestController 是一个 Spring 框架中的注解,用于标识一个类是一个 RESTful Web 服务的控制器类。使用 @RestController 注解可以将一个类标记为控制器类,并自动将返回值转换为 JSON 或 XML 等格式的响应。

具体来说,@RestController 注解是 @Controller 注解和 @ResponseBody 注解的组合。@Controller 注解用于标识一个类为控制器类,而 @ResponseBody 注解用于指示返回的结果要作为响应体返回给客户端。

使用 @RestController 注解时,可以在类或方法上使用其他注解,如 @RequestMapping@GetMapping@PostMapping 等,用于指定请求路径和请求方法。

以下是一个使用 @RestController 注解的示例:

less 复制代码
@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }

    @PostMapping("/data")
    public MyData saveData(@RequestBody MyData data) {
        // 处理保存数据的逻辑
        return data;
    }

    // 其他方法...
}

在上面的示例中,MyController 类被标注为一个 RESTful Web 服务的控制器类。使用 @RequestMapping 注解指定了根路径为 "/api",而 @GetMapping@PostMapping 注解指定了不同的路径和请求方法。sayHello() 方法返回一个字符串作为响应体,saveData() 方法接收一个请求体,然后返回一个对象作为响应体。

总之,@RestController 注解用于标识一个类为 RESTful Web 服务的控制器类,并将方法的返回值自动转换为 JSON 或 XML 等格式的响应。它简化了编写和配置控制器类的过程,并提供了方便的请求处理和响应转换功能。

@Service

@Service 是一个 Spring 框架中的注解,用于标识一个类为服务类(Service Class)。

在应用程序中,服务类通常用于封装业务逻辑,例如处理数据、调用其他组件或服务、执行业务规则等。通过使用 @Service 注解,可以告诉 Spring 框架该类是一个服务类,从而让框架能够自动进行依赖注入、事务管理等操作。

以下是一个使用 @Service 注解的示例:

java 复制代码
@Service
public class MyService {
    // ...
}

在上面的示例中,MyService 类被标注为一个服务类,以便 Spring 框架能够识别和管理该类。一旦标注为服务类,Spring 框架就会自动为该类创建一个实例,并在需要时进行依赖注入、事务管理等操作。

需要注意的是,@Service 注解是 Spring 框架提供的,用于标识服务类的角色,它是基于 @Component 注解的拓展。因此,@Service 注解可以理解为 @Component 注解的特例,用于更加明确地表明一个类是服务类。

同时,@Service 注解还可以与其他注解如 @Autowired@Transactional 等一起使用,以完成依赖注入、事务管理等特定的功能。

总结来说,@Service 注解用于标识一个类为服务类,使得 Spring 框架能够自动进行依赖注入、事务管理等操作。通过使用 @Service 注解,我们可以更加清晰地定义服务类的角色,使得代码更加易读、易维护。

AOP

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从核心业务逻辑中分离出来,提供一种可重用和可维护的方式来处理横切关注点。

在传统的面向对象编程中,程序的功能被划分为一个个的模块或类,每个模块或类负责特定的功能。然而,有些功能会横跨多个模块或类,如日志记录、事务管理、权限控制等。这些横切关注点会与核心业务逻辑耦合在一起,导致代码的重复、可维护性差等问题。

AOP 的思想是将这些横切关注点进行解耦,通过将其抽象为切面(aspect),并将其独立于主要的业务逻辑进行织入(weave)。切面定义了在横切关注点上执行的行为,如日志记录、事务管理等。在程序运行时,AOP 框架会动态地将切面织入到目标对象的方法中,从而实现对横切关注点的处理。

AOP 的核心概念包括以下几个:

  1. 切面(Aspect):切面是一个模块化的单元,它封装了横切关注点的行为。它定义了在何处(切点)和何时(通知)执行特定的行为。切面可以被织入到一个或多个目标对象中。

  2. 切点(Pointcut):切点是一组特定的连接点的集合,它表示在目标对象中具体要织入切面的位置。切点可以使用表达式或模式来定义。

  3. 通知(Advice):通知是在切点上执行的具体行为。AOP 中定义了几种类型的通知,如前置通知(Before Advice)、后置通知(After Advice)、异常通知(After Throwing Advice)、返回通知(After Returning Advice)和环绕通知(Around Advice)等。

  4. 织入(Weaving):织入是将切面应用于目标对象的过程。可以在编译时、加载时或运行时进行织入。

常见的 Java AOP 框架包括 Spring AOP、AspectJ 等。这些框架提供了丰富的注解或配置方式来定义切面、切点和通知,并通过代理或字节码增强等技术来实现切面的织入。

总结来说,AOP 是一种将横切关注点与核心业务逻辑分离的编程范式。它通过定义切面、切点和通知的方式,将横切关注点的行为织入到目标对象的方法中,从而实现对横切关注点的处理。AOP 提供了一种可重用和可维护的方式来处理横切关注点,使代码更加模块化和可扩展。

@Transactional

Spring的@Transactional注解是用于管理事务的注解,它可以应用于方法或类级别。

当应用于方法上时,@Transactional注解表示该方法应该在一个事务中执行。如果当前没有正在进行的事务,它将创建一个新的事务。如果存在已经开始的事务,它将加入到该事务中。如果方法执行成功,事务将被提交。如果方法执行过程中发生异常,事务将被回滚。

@Transactional注解还可以用于类级别,表示该类的所有公共方法都应该在一个事务中执行。这意味着类中的所有方法将共享同一个事务,并且事务的提交或回滚将取决于每个方法的执行结果。

@Transactional注解还提供了许多属性,可以用于配置事务的行为,例如事务的隔离级别、传播行为、超时设置等。通过使用这些属性,可以更细粒度地控制事务的行为。

使用@Transactional注解可以简化事务管理的代码,并提供了一种声明式的方式来管理事务。它使得开发者可以将注意力集中在业务逻辑上,而不是手动处理事务的细节。

事务

事务的实现逻辑可以分为以下几个步骤:

  1. 开始事务:当一个方法被标记为@Transactional时,事务管理器会在方法执行前自动开始一个新的事务。事务管理器会创建一个数据库连接,并将其与当前线程关联起来。

  2. 执行业务逻辑:事务开始后,方法中的业务逻辑将被执行。这包括数据库操作、业务计算等。

  3. 提交或回滚事务:一旦业务逻辑执行完成,事务管理器会根据方法的执行结果决定是提交事务还是回滚事务。如果方法执行成功,事务管理器会将所有的数据库操作提交到数据库中。如果方法执行失败或抛出异常,事务管理器会回滚事务,撤销所有的数据库操作,恢复到事务开始前的状态。

  4. 释放资源:事务完成后,事务管理器会释放数据库连接和其他相关资源。这样可以保证连接的有效使用,并防止资源泄漏。

在Spring框架中,事务的实现是通过AOP(Aspect-Oriented Programming)的方式实现的。Spring通过在运行时动态地为@Transactional注解的方法生成代理类,将事务管理的逻辑织入到方法调用中。这样,当调用被@Transactional注解标记的方法时,代理类会在方法执行前开始事务,执行方法的业务逻辑,然后根据方法的执行结果决定是提交事务还是回滚事务。

事务管理器负责管理数据库连接和事务的提交和回滚。它会在方法执行前获取数据库连接,并将其与当前线程关联起来。在方法执行过程中,事务管理器会监视方法的执行结果,并在方法执行完成后根据结果进行事务的提交或回滚。最后,在事务完成后,事务管理器会释放数据库连接和其他相关资源。

通过这种方式,Spring框架实现了声明式的事务管理,使开发者可以将注意力集中在业务逻辑上,而不必手动处理事务的细节。

SQL简单实现事务

sql 复制代码
START TRANSACTION;

-- 执行一系列的SQL操作
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
UPDATE table_name SET column1 = value1 WHERE condition;
DELETE FROM table_name WHERE condition;

-- 根据条件判断是否需要回滚事务
IF some_condition THEN
    ROLLBACK;
END IF;

-- 如果所有操作都成功,提交事务
COMMIT;

Lombok

Lombok是一个Java库,它通过注解来简化Java类的编写。Lombok提供了一系列的注解,可以自动生成Java类的常见方法(如getter、setter、toString等)以及其他一些常用的代码模式。通过使用Lombok,可以减少样板代码的编写,提高代码的可读性和简洁性。

相关推荐
星星法术嗲人3 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
一丝晨光21 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白24 分钟前
Stream流的中间方法
java·开发语言·windows
Jay_fearless32 分钟前
Redis SpringBoot项目学习
spring boot·redis
xujinwei_gingko35 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
liuyang-neu36 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
一丝晨光1 小时前
Java、PHP、ASP、JSP、Kotlin、.NET、Go
java·kotlin·go·php·.net·jsp·asp
罗曼蒂克在消亡1 小时前
2.3MyBatis——插件机制
java·mybatis·源码学习
_GR1 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
coderWangbuer1 小时前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql