依赖注入
依赖注入(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 的核心概念包括以下几个:
-
切面(Aspect):切面是一个模块化的单元,它封装了横切关注点的行为。它定义了在何处(切点)和何时(通知)执行特定的行为。切面可以被织入到一个或多个目标对象中。
-
切点(Pointcut):切点是一组特定的连接点的集合,它表示在目标对象中具体要织入切面的位置。切点可以使用表达式或模式来定义。
-
通知(Advice):通知是在切点上执行的具体行为。AOP 中定义了几种类型的通知,如前置通知(Before Advice)、后置通知(After Advice)、异常通知(After Throwing Advice)、返回通知(After Returning Advice)和环绕通知(Around Advice)等。
-
织入(Weaving):织入是将切面应用于目标对象的过程。可以在编译时、加载时或运行时进行织入。
常见的 Java AOP 框架包括 Spring AOP、AspectJ 等。这些框架提供了丰富的注解或配置方式来定义切面、切点和通知,并通过代理或字节码增强等技术来实现切面的织入。
总结来说,AOP 是一种将横切关注点与核心业务逻辑分离的编程范式。它通过定义切面、切点和通知的方式,将横切关注点的行为织入到目标对象的方法中,从而实现对横切关注点的处理。AOP 提供了一种可重用和可维护的方式来处理横切关注点,使代码更加模块化和可扩展。
@Transactional
Spring的@Transactional注解是用于管理事务的注解,它可以应用于方法或类级别。
当应用于方法上时,@Transactional注解表示该方法应该在一个事务中执行。如果当前没有正在进行的事务,它将创建一个新的事务。如果存在已经开始的事务,它将加入到该事务中。如果方法执行成功,事务将被提交。如果方法执行过程中发生异常,事务将被回滚。
@Transactional注解还可以用于类级别,表示该类的所有公共方法都应该在一个事务中执行。这意味着类中的所有方法将共享同一个事务,并且事务的提交或回滚将取决于每个方法的执行结果。
@Transactional注解还提供了许多属性,可以用于配置事务的行为,例如事务的隔离级别、传播行为、超时设置等。通过使用这些属性,可以更细粒度地控制事务的行为。
使用@Transactional注解可以简化事务管理的代码,并提供了一种声明式的方式来管理事务。它使得开发者可以将注意力集中在业务逻辑上,而不是手动处理事务的细节。
事务
事务的实现逻辑可以分为以下几个步骤:
-
开始事务:当一个方法被标记为@Transactional时,事务管理器会在方法执行前自动开始一个新的事务。事务管理器会创建一个数据库连接,并将其与当前线程关联起来。
-
执行业务逻辑:事务开始后,方法中的业务逻辑将被执行。这包括数据库操作、业务计算等。
-
提交或回滚事务:一旦业务逻辑执行完成,事务管理器会根据方法的执行结果决定是提交事务还是回滚事务。如果方法执行成功,事务管理器会将所有的数据库操作提交到数据库中。如果方法执行失败或抛出异常,事务管理器会回滚事务,撤销所有的数据库操作,恢复到事务开始前的状态。
-
释放资源:事务完成后,事务管理器会释放数据库连接和其他相关资源。这样可以保证连接的有效使用,并防止资源泄漏。
在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,可以减少样板代码的编写,提高代码的可读性和简洁性。