AOP操作两种方式
AOP操作(AspectJ注解)
AOP操作准备:Spring框架一般基于AspectJ实现AOP操作,
实现方式:基于XML配置文件实现、基于注解方式实现(常用)
在项目工程引入AOP相关依赖,
切入点表达式:知道哪个类里面的哪个方法增强
语法结构:execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
举例1:对com.atguigu.dao包中BookDao类里的add方法进行增强,
execution(* com.atguigu.dao.BookDao.add(..)) //用*表示任意修饰符都可以,..表示参数
举例2:对com.atguigu.dao包中BookDao类里的所有方法进行增强,
execution(* com.atguigu.dao.BookDao.*(..)) //这里*表示所有方法
举例3:对com.atguigu.dao包中所有类,类中所有方法进行增强,
execution(* com.atguigu.dao.*.*(..))
1.创建类,,在类中定义方法
2.创建增强类(编写增强逻辑)
在增强类中,创建方法,让不同的方法代表不同通知类型
3.进行通知的配置,在SpringXML配置文件中,开启注解扫描
3.1使用注解创建User和UserProxy对象
4.在增强类上添加注解@Aspect
5.在Spring配置文件开启生成代理对象
6.配置不同类型的通知
在增强类里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
@Component//创建对象注解
@Aspect //生成代理对象
public class UserProxy {
//前置通知
//这个before注解表示前置通知
@Before(value = "execution(* com.atguigu.Springdemo.aop.User.add(..))")//对该路径下方法增强
public void before()
{
System.out.println("before");
}
//最终通知,不管有无异常都执行
@After(value = "execution(* com.atguigu.Springdemo.aop.User.add(..))")
public void after()
{
System.out.println("after");
}
//有异常不执行,后置通知
@AfterReturning(value = "execution(* com.atguigu.Springdemo.aop.User.add(..))")
public void afterReturning()
{
System.out.println("afterReturning");
}
//异常通知
@AfterThrowing(value = "execution(* com.atguigu.Springdemo.aop.User.add(..))")
public void afterThrowing()
{
System.out.println("afterThrowing");
}
//环绕通知
@Around(value = "execution(* com.atguigu.Springdemo.aop.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
{
System.out.println("环绕之前");
//被增强方法执行
proceedingJoinPoint.proceed();
System.out.println("环绕之后");
}
}
测试:
7.相同切入点抽取(发现5个通知里对execution(* com.atguigu.Springdemo.aop.User.add(..))抽取
8.有多个增强类,对同一个方法进行增强,设置增强类优先级
在增强类上添加注解@Order(数字类型值),值越小,优先级高
AOP操作(AspectJ配置文件)理解
1.创建两个类、增强类和被增强类,创建方法
2.在Spring配置文件里创建两个类对象
3.在Spring配置文件里配置切入点
<!--配置aop增强-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="p" expression="execution(* com.atguigu.Springdemo.aopxml.Book.buy())"/>
<!--配置切面-->
<aop:aspect ref="bookProxy"><!--增强类-->
<!--配置增强作用于具体方法上-->
<!--前面的before指的是做的是before通知、method写的是增强的方法、pointcut-ref作用于哪个切入点-->
<aop:before method="before" pointcut-ref="p"/>
</aop:aspect>
</aop:config>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理