欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

AOP:【动态代理】||@Pointcut

发布时间:2025/4/16 编程问答 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 AOP:【动态代理】||@Pointcut 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

AOP:【动态代理】 * 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式

* 1、导入aop模块;Spring AOP:(spring-aspects)

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-aspects</artifactId>
   <version>4.3.12.RELEASE</version>
</dependency>

* 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)
* 3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;
*     通知方法
*        前置通知(@Before):logStart:在目标方法(div)运行之前运行
*        后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
*        返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
*        异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
*        环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.proceed()
* 4、给切面类的目标方法标注何时何地运行(通知注解)
* 5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
* 6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect )
* 7、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
*     在Spring中很多的 @EnableXXX;

* 三步: * 1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect) * 2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式) * 3)、开启基于注解的aop模式;@EnableAspectJAutoProxy

MathCalculator.java

package com.dym.aop;public class MathCalculator {public int div(int i,int j){System.out.println("MathCalculator...div...");return i/j; }}

LogAspects.java

package com.dym.aop;import java.util.Arrays;import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut;/*** @Aspect: 告诉Spring当前类是一个切面类*/ @Aspect public class LogAspects {//抽取公共的切入点表达式//1、本类引用//2、其他的切面引用@Pointcut("execution(public int com.dym.aop.MathCalculator.*(..))")public void pointCut() {};//@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)@Before("pointCut()")public void logStart(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();System.out.println("" + joinPoint.getSignature().getName() + "运行。。。@Before:参数列表是:{" + Arrays.asList(args) + "}");}@After("com.dym.aop.LogAspects.pointCut()")public void logEnd(JoinPoint joinPoint) {System.out.println("" + joinPoint.getSignature().getName() + "结束。。。@After");}//JoinPoint一定要出现在参数表的第一位@AfterReturning(value = "pointCut()", returning = "result")public void logReturn(JoinPoint joinPoint, Object result) {System.out.println("" + joinPoint.getSignature().getName() + "正常返回。。。@AfterReturning:运行结果:{" + result + "}");}@AfterThrowing(value = "pointCut()", throwing = "exception")public void logException(JoinPoint joinPoint, Exception exception) {System.out.println("" + joinPoint.getSignature().getName() + "异常。。。异常信息:{" + exception + "}");}}

MainConfigOfAOP.java

package com.dym.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy;import com.dym.aop.LogAspects; import com.dym.aop.MathCalculator;@EnableAspectJAutoProxy @Configuration public class MainConfigOfAOP {//业务逻辑类加入容器中@Beanpublic MathCalculator calculator(){return new MathCalculator();}//切面类加入到容器中@Beanpublic LogAspects logAspects(){return new LogAspects();} }

IOCTest_AOP.java

package com.dym.test;import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.dym.aop.MathCalculator; import com.dym.config.MainConfigOfAOP;public class IOCTest_AOP {@Testpublic void test01(){AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);//1、不要自己创建对象 // MathCalculator mathCalculator = new MathCalculator(); // mathCalculator.div(1, 1);MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);mathCalculator.div(1, 1);applicationContext.close();}}

​​​​​​​

总结

以上是生活随笔为你收集整理的AOP:【动态代理】||@Pointcut的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。