AOP
发表日期: 2023-06-19
更新日期: 2023-06-19
阅读量: 未知
AOP基本概念:
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,通过将横切关注点从业务逻辑中分离出来,实现关注点的模块化和可重用性,同时不改变原有逻辑。
AOP核心概念
连接点(JoinPoint):
连接点是程序执行过程中的特定位置,通常指方法的执行点。
1 2 3 4 5 6 7 8 9
| java复制代码@Service public class UserService {
public void saveUser(String username) { // 保存用户信息的业务逻辑 // 连接点 System.out.println("Saving user: " + username); } }
|
切入点(Pointcut):
切入点定义了在应用通知的位置,可以是一个或多个连接点的集合。
1 2 3 4 5 6 7 8 9 10
| java复制代码@Service public class UserService {
public void saveUser(String username) { // 保存用户信息的业务逻辑 // 连接点 // 切入点 System.out.println("Saving user: " + username); } }
|
通知(Advice):
通知是在切入点处执行的具体操作,例如在方法执行前或执行后执行的共性功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| java复制代码@Aspect @Component public class LoggingAspect {
@Before("execution(* com.example.service.UserService.saveUser(..))") public void beforeSaveUser() { System.out.println("Before saving user: Logging user information..."); }
@After("execution(* com.example.service.UserService.saveUser(..))") public void afterSaveUser() { System.out.println("After saving user: Logging user information..."); } }
|
切面(Aspect):
切面将通知与切入点结合起来,描述了何时和在何处应用通知。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| java复制代码@Aspect @Component public class LoggingAspect {
@Before("execution(* com.example.service.UserService.saveUser(..))") public void beforeSaveUser() { System.out.println("Before saving user: Logging user information..."); }
@After("execution(* com.example.service.UserService.saveUser(..))") public void afterSaveUser() { System.out.println("After saving user: Logging user information..."); } }
|
结果展示
1 2 3
| sql复制代码Before saving user: Logging user information... Saving user: John After saving user: Logging user information...
|
AOP的优点
- 提高代码的复用性和可维护性。
- 提高代码的可读性和可维护性。
- 降低模块之间的耦合性,解耦横切关注点。
- 业务代码不受非业务代码的影响,逻辑更加清晰。