当前位置: 首页 > news >正文

Spring AOP - 注解方式实现

        前文已经讨论了基于配置文件方式实现Spring AOP(Spring AOP - 配置文件方式实现),本文采用注解的方式实现前文相同的功能。配置步骤如下:

        1、项目增加aop依赖(pom.xml)

        <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.20.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

         2、配置文件增加注解扫描的包(applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 扫描com.text包及子包下的注解--><context:component-scan base-package="com.text"/>
</beans>

        3、增加切面类(开启切面注解@EnableAspectJAutoProxy、增加切面标识@Aspect)及通知方法(环绕通知@Around,并配置切点表达式execution)

package com.text.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import java.util.Date;/*** 定义方法切面类*/
@EnableAspectJAutoProxy //开启AspectJ的注解方式
@Component
@Aspect //标识为切面类
public class MethodAspect {//配置环绕通知@Around("execution(public * com.text..*DaoImpl.*(..))")public void countMethodInvokeTime(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("目标方法执行之前记录初始时间...");Date startTime = new Date();try {proceedingJoinPoint.proceed();//执行目标方法 即:StudentDaoImpl.getById方法System.out.println("目标方法执行之后记录结束时间...");String methodName = proceedingJoinPoint.getTarget().getClass().getName() + "." +proceedingJoinPoint.getSignature().getName();Date endTime = new Date();System.out.println(methodName + "方法执行总时长为:" + (endTime.getTime() - startTime.getTime()) + "毫秒");} catch (Throwable throwable) {throwable.printStackTrace();}}
}

        4、业务方法StudentDaoImpl

package com.text.dao.impl;
import com.text.dao.StudentDao;
import org.springframework.stereotype.Repository;@Repository
public class StudentDaoImpl implements StudentDao {@Overridepublic void getById(String id) throws Exception {Thread.sleep(1000);System.out.println("查询学生id=" + id + "的信息");}
}

         5、测试类Application

package com.text;import com.text.dao.StudentDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Application {public static void main(String[] args) throws Exception {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");StudentDao studentDao = context.getBean("studentDaoImpl", StudentDao.class);studentDao.getById("1");System.out.println("======getById end ========");}
}

        6、程序运行结果


http://www.mrgr.cn/news/34244.html

相关文章:

  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • 第8章利用CSS制作导航菜单
  • 泷羽sec学习打卡-Linux基础
  • 图片的鱼眼批量矫正算法
  • 数据结构中数据有序性/ 单调性 ——二分查找
  • MDBook 使用指南
  • Redis Sorted Set 跳表的实现原理和分析
  • 简单使用tesseract-ocr提取图片中的文字
  • angular封装好的组件的收到原生输入框的change事件
  • 可编辑PPT | 能源企业数字化框架、数字化运营及数字化平台建设方案
  • 石头剪刀布手势识别系统源码分享
  • 图论(dfs深搜系列)9.23
  • 甩锅笔记:好好的服务端应用突然起不来,经定位是无法访问外网了?测试又说没改网络配置,该如何定位?
  • 基于Ambari搭建hadoop生态圈+Centos7安装教程V2.0优化版(本篇博客写的较为详细,可能比较多,请耐心看)
  • 【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现
  • 最适配达梦、人大金仓的sql工具是什么?
  • HTTP代理域名解析的先后顺序:深入解析
  • 共享内存详解
  • 51WORLD打造土耳其奥斯曼尼耶城市大脑,助力中东城市智慧化转型
  • 深入解析:从URL到页面渲染的完整过程与性能优化【页面渲染、重排、重汇】
  • 仓颉编程语言4,遇到BUG求助
  • 浅谈人工智能技术,对社会经济变革的思考
  • Linux(麒麟系统)多显示器屏幕录制
  • 软件测试实验室如何利用GB/T25000标准建立测试技术体系
  • 828华为云征文 | 云服务器Flexus X实例,Docker集成搭建NGINX
  • 超详细超实用!!!AI编程之cursor编写官网新增轮播效果(三)