ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring--AOP案例以及使用先容 [打印本页]

作者: 九天猎人    时间: 2024-9-4 14:01
标题: Spring--AOP案例以及使用先容
AOP案例

1 案例-测量业务层接口万次执行效率

问题导入

能不能描述一下围绕通知内里的实现步骤?
1.1 需求和分析

需求:任意业务层接口执行均可表现其执行效率(执行时长)
分析:
​ ①:业务功能:业务层接口执行前后分别记载时间,求差值得到执行效率
​ ②:通知类型选择前后均可以加强的类型——围绕通知
1.2 代码实现

【前置工作】环境准备

【第一步】编写通知类

  1. @Component
  2. @Aspect
  3. public class ProjectAdvice {
  4.     //匹配业务层的所有方法
  5.     @Pointcut("execution(* com.itheima.service.*Service.*(..))")
  6.     private void servicePt(){}
  7.     //设置环绕通知,在原始操作的运行前后记录执行时间
  8.     @Around("ProjectAdvice.servicePt()") //本类类名可以省略不写
  9.     public void runSpeed(ProceedingJoinPoint pjp) throws Throwable {
  10.         //获取执行的签名对象
  11.         Signature signature = pjp.getSignature();
  12.         //获取接口/类全限定名
  13.         String className = signature.getDeclaringTypeName();
  14.         //获取方法名
  15.         String methodName = signature.getName();
  16.         //记录开始时间
  17.         long start = System.currentTimeMillis();
  18.         //执行万次操作
  19.         for (int i = 0; i < 10000; i++) {
  20.            pjp.proceed();
  21.         }
  22.         //记录结束时间
  23.         long end = System.currentTimeMillis();
  24.         //打印执行结果
  25.         System.out.println("万次执行:"+ className+"."+methodName+"---->" +(end-start) + "ms");
  26.     }
  27. }
复制代码
【第二步】在SpringConfig配置类上开启AOP注解功能

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @PropertySource("classpath:jdbc.properties")
  4. @Import({JdbcConfig.class,MybatisConfig.class})
  5. @EnableAspectJAutoProxy //开启AOP注解功能
  6. public class SpringConfig {
  7. }
复制代码
【第三步】运行测试类,检察结果

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(classes = SpringConfig.class)
  3. public class AccountServiceTestCase {
  4.     @Autowired
  5.     private AccountService accountService;
  6.     @Test
  7.     public void testFindById(){
  8.         Account account = accountService.findById(2);
  9.     }
  10.     @Test
  11.     public void testFindAll(){
  12.         List<Account> list = accountService.findAll();
  13.     }
  14. }
复制代码
2 AOP切入点数据获取

问题导入

在围绕通知中可以获取到哪些数据?
2.1 获取参数

   说明:在前置通知和围绕通知中都可以获取到毗连点方法的参数们
  
  1. @Before("pt()")
  2. public void before(JoinPoint jp) {
  3.     Object[] args = jp.getArgs(); //获取连接点方法的参数们
  4.     System.out.println(Arrays.toString(args));
  5. }
复制代码

  1. @Around("pt()")
  2. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  3.     Object[] args = pjp.getArgs(); //获取连接点方法的参数们
  4.     System.out.println(Arrays.toString(args));
  5.     Object ret = pjp.proceed();
  6.     return ret;
  7. }
复制代码
2.2 获取返回值

   说明:在返回后通知和围绕通知中都可以获取到毗连点方法的返回值
  
  1. @AfterReturning(value = "pt()",returning = "ret")
  2. public void afterReturning(String ret) { //变量名要和returning="ret"的属性值一致
  3.     System.out.println("afterReturning advice ..."+ret);
  4. }
复制代码

  1. @Around("pt()")
  2. public Object around(ProceedingJoinPoint pjp) throws Throwable {
  3.     // 手动调用连接点方法,返回值就是连接点方法的返回值
  4.     Object ret = pjp.proceed();
  5.     return ret;
  6. }
复制代码
2.3 获取异常

   说明:在抛出异常后通知和围绕通知中都可以获取到毗连点方法中出现的异常
  
  1. @AfterThrowing(value = "pt()",throwing = "t")
  2. public void afterThrowing(Throwable t) {//变量名要和throwing = "t"的属性值一致
  3.     System.out.println("afterThrowing advice ..."+ t);
  4. }
复制代码

  1. @Around("pt()")
  2. public Object around(ProceedingJoinPoint pjp)  {
  3.     Object ret = null;
  4.     //此处需要try...catch处理,catch中捕获到的异常就是连接点方法中抛出的异常
  5.     try {
  6.         ret = pjp.proceed();
  7.     } catch (Throwable t) {
  8.         t.printStackTrace();
  9.     }
  10.     return ret;
  11. }
复制代码
3 案例-百度网盘密码数据兼容处理

问题导入

请说出我们该使用什么类型的通知来完成这个需求?
3.1 需求和分析

需求:对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理
分析:
①:在业务方法执行之前对所有的输入参数举行格式处理——trim()
②:使用处理后的参数调用原始方法——围绕通知中存在对原始方法的调用
3.2 代码实现

【前置工作】环境准备

  1. //-------------service层代码-----------------------
  2. public interface ResourcesService {
  3.     public boolean openURL(String url ,String password);
  4. }
  5. @Service
  6. public class ResourcesServiceImpl implements ResourcesService {
  7.     @Autowired
  8.     private ResourcesDao resourcesDao;
  9.     public boolean openURL(String url, String password) {
  10.         return resourcesDao.readResources(url,password);
  11.     }
  12. }
  13. //-------------dao层代码-----------------------
  14. public interface ResourcesDao {
  15.     boolean readResources(String url, String password);
  16. }
  17. @Repository
  18. public class ResourcesDaoImpl implements ResourcesDao {
  19.     public boolean readResources(String url, String password) {
  20.         System.out.println(password.length());
  21.         //模拟校验
  22.         return password.equals("root");
  23.     }
  24. }
复制代码
【第一步】编写通知类

  1. @Component
  2. @Aspect
  3. public class DataAdvice {
  4.    
  5.     @Pointcut("execution(boolean com.itheima.service.*Service.*(*,*))")
  6.     private void servicePt(){}
  7.     @Around("DataAdvice.servicePt()")
  8.     public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
  9.         Object[] args = pjp.getArgs();
  10.         for (int i = 0; i < args.length; i++) {
  11.             //判断参数是不是字符串
  12.             if(args[i].getClass().equals(String.class)){
  13.                 args[i] = args[i].toString().trim();
  14.             }
  15.         }
  16.         Object ret = pjp.proceed(args);
  17.         return ret;
  18.     }
  19. }
复制代码
【第二步】在SpringConfig配置类上开启AOP注解功能

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @EnableAspectJAutoProxy
  4. public class SpringConfig {
  5. }
复制代码
【第三步】运行测试类,检察结果

  1. public class App {
  2.     public static void main(String[] args) {
  3.         ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  4.         ResourcesService resourcesService = ctx.getBean(ResourcesService.class);
  5.         boolean flag = resourcesService.openURL("http://pan.baidu.com/haha", "root ");
  6.         System.out.println(flag);
  7.     }
  8. }
复制代码
4 AOP开辟总结

4.1 AOP的核心概念


4.2 切入点表达式语法


4.3 五种通知类型



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4