本博文是学习W3Cschool文章
https://www.w3cschool.cn/wkspring/izae1h9w.html
的学习笔记,如有侵权会立马删除
一、Spring框架的AOP
AOP(面向切面编程),把程序逻辑分解成不同的部分成为所谓的关注点,扩一个应用程序的多个点的功能被称为横切关注点,这些横切关注点要独立于应用程序的业务逻辑。可以应用于日志记录,审计,声明式事务,安全性和缓存等。
在OOP中,关键单元模块是类,在AOP中是切面。依赖注入帮助我们对应用程序对象相互解耦,AOP可以实现所影响的对象对横切关注点解耦。
二、AOP术语
项 | 描述 |
---|---|
Aspect | 一个模块具有一组提供横切需求的 APIs。例如,一个日志模块为了记录日志将被 AOP 方面调用。应用程序可以拥有任意数量的方面,这取决于需求。 |
Join point | 在你的应用程序中它代表一个点,你可以在插件 AOP 方面。你也能说,它是在实际的应用程序中,其中一个操作将使用 Spring AOP 框架。 |
Advice | 这是实际行动之前或之后执行的方法。这是在程序执行期间通过 Spring AOP 框架实际被调用的代码。 |
Pointcut | 这是一组一个或多个连接点,通知应该被执行。你可以使用表达式或模式指定切入点正如我们将在 AOP 的例子中看到的。 |
三、通知类型
可以实现五种通知,前置通知、后置通知、返回后通知、抛出异常后通知和环绕通知。
四、用@Aspect方式自定义AOP
在spring-boot中导入如下的包
1.声明一个aspect
@Aspect
@Component
public class LogAspect {
//在controller设计一个切面,来记录请求数据和返回数据
}
2.声明一个切入点
//将log切入点和com.zph.springbootapi.api包下的LogTestApi类中的log方法想匹配
@Pointcut("execution(* com.zph.springbootapi.api.LogTestApi.log(..))")
public void log(){
}
//如果是想匹配一个类下的所有方法可以使用
// @Pointcut("execution(* com.zph.springbootapi.api.LogTestApi.*.*(..))")
3.声明建议
五种建议
@Before("log()")
public void doBefore(){
logger.info("--------doBefore 1----------");
}
@After("log()")
public void doAfter(){
logger.info("--------doAfter 2----------");
}
@AfterReturning(returning = "result",pointcut = "log()")
public void doAfterReturning(Object result){
logger.info("--------doAfterReturning ----------:内容{}",result);
}
@AfterThrowing(pointcut = "log()", throwing="ex")
public void doAfterThrowing(Exception ex){
logger.info("--------doAfterThrowing ---------- :{}",ex.getMessage());
}
@Around("log()")
public void doAround(){
logger.info("--------doAround ---------- ");
}