AOP基本概念:
AOP是在不改变原有逻辑的情况下进行功能增强,是一种思想的体现,和面向对象一样是一种编程范式,通过将横切关注点(cross-cuttingconcerns)从业务逻辑中分s离出来,实现了关注点的模块化和可重用性。
AOP核心概念:
连接点(JoinPoint):
程序执行过程中的任意位置,springaop中,理解为方法的执行。
1 2 3 4 5 6 7 8 9 10
| @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
| @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
| @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
| public class LoggingAspect {...}
|
切面(Asepect):
描述通知与切入点的对应关系。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @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 4
| Before saving user: Logging user information... Saving user: John After saving user: Logging user information...
|
AOP的优点:
1提高代码的复用性和可维护性。复用性:一些新增的设置或新增功能可以被多个切入点调用。可维护性:对一些功能进行修改只需要在通知类里修改即可
2提高代码的可维护性和可读性。把重复性的代码从业务代码中抽离出来。
3降低模块之间的耦合性,横切关注点的解耦(如日志记录、安全性检查、事务管理等)。
4业务代码不受非业务代码的影响,逻辑更加清晰。