Spring-基于xml的AOP快速入门案例

ゝ一纸荒年。 2022-12-01 15:45 202阅读 0赞

问题引出
AOP:Aspect Oriented Programming,面向切面编程。是通过预编译方式(aspectj)或者运行期动态代理(Spring)实现程序功能的统一维护的技术。
在实际项目中,我们都会遇到对原有功能的迭代与增强,修改源码是一件很痛苦的事情,往往会牵一发而动全身。怎样做到在不修改源码的情况下对原有功能进行增强呢?aop思想就是在这种需求中产生的。


AOP作为Spring最大特征之一,它的

  • 作用:不修改源码的情况下,进行功能增强,通过动态代理实现的
  • 优势:减少重复代码,提高开发效率,方便维护
  • 比如:给功能增加日志输出, 事务管理的功能

快速入门案例:
第一步:导入jar包依赖

  1. <!--Spring上下文核心包-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-context</artifactId>
  5. <version>5.1.2.RELEASE</version>
  6. </dependency>
  7. <!--AOP的实现包-->
  8. <dependency>
  9. <groupId>org.aspectj</groupId>
  10. <artifactId>aspectjweaver</artifactId>
  11. <version>1.8.9</version>
  12. </dependency>
  13. <!--Spring和单元测试集成-->
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-test</artifactId>
  17. <version>5.1.2.RELEASE</version>
  18. </dependency>
  19. <!--单元测试-->
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>4.12</version>
  24. </dependency>

** 第二步:创建目标类和通知类
目标类(需要增强或者说需要切入的类):

  1. public class UserService{
  2. void save();
  3. }
  4. @Service("userervice")
  5. public class UserServiceImpl {
  6. public void save(){
  7. System.out.println("UserServiceImpl.save......");
  8. }
  9. }

通知类

  1. import org.aspectj.lang.ProceedingJoinPoint;
  2. import org.springframework.stereotype.Component;
  3. /**
  4. * 注意:此类为通知类,切面的配置=通知类+切入点 两者组成
  5. * 需要在xml文件中配置才能生效
  6. */
  7. @Component("myAdvice")
  8. public class MyAdvice {
  9. //方法执行前调用
  10. public void before(){
  11. System.out.println("前置通知。。。");
  12. }
  13. //后置返回通知
  14. public void afterReturning(){
  15. System.out.println("后置返回通知");
  16. }
  17. //后置异常通知
  18. public void afterThrowing(){
  19. System.out.println("后置异常通知");
  20. }
  21. //后置通知,无论异常与否都会执行。
  22. public void after(){
  23. System.out.println("后置最终通知");
  24. }
  25. //环绕通知,此方法相当于前置通知和后置返回通知的整合,根据具体业务需求而定
  26. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  27. //原有方法执行之前插入的增强代码,这里我们输入语句替代
  28. System.out.println("环绕前置通知");
  29. //原有方法的调用
  30. Object proceed = pjp.proceed();
  31. //原有方法执行之后插入的增强代码,这里我们输入语句替代
  32. System.out.println("环绕后置通知");
  33. return proceed;
  34. }
  35. }

第三步, 修改配置文件

  1. 把目标类和通知类都配置到Spring配置文件中
  2. 配置切入和通知方法(增强方法)的织入关系

    <?xml version=”1.0” encoding=”UTF-8”?>

























第四步:测试

  1. import com.gg.service.UserService;
  2. import org.junit.Test;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class AopXmlTest {
  5. @Test
  6. public void xmlTest01(){
  7. //加载核心配置文件
  8. ClassPathXmlApplicationContext appConfig = new ClassPathXmlApplicationContext("classpath:appConfig.xml");
  9. //获得指定bean对象
  10. UserService userService = appConfig.getBean("userService", UserService.class);
  11. //调用方法,判断是否切入成功
  12. userService.save();
  13. }
  14. }

测试结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读