基于注解的Aop实现

本文介绍了如何使用SpringAOP技术对DAO层的增删改查方法进行耗时统计,通过注解方式配置通知,并展示了如何在满足特定需求时更新通知以排除查询方法。
摘要由CSDN通过智能技术生成

资源下载链接

基于注解的AOP实现

一、实现思路

        利用Spring AOP技术,实现dao层方法的耗时统计。要求:

        1、DAO层:在com.sw.dao包下创建接口UserDao.java,定义增删改查四个方法

        2、DAO层的实现类:在com.sw.dao包下创建impl包,在impl包下创建UserDao接口的实现类UserDaoImpl,在UserDaoImpl类中实现增删改查四个方法

        3、pojo对象AnnoAdvice,定义通知

        4、基于注解的方式配置Spring AOP

        5、测试

二、编码实现

1、新建项目

        搭建环境:pom.xml文件、Spring配置文件applicationContext.xml

2、DAO层

        com.sw.dao包,UserDao接口

public interface UserDao {
    void insert();
    void delete();
    void update();
    void select();
}

        com.sw.dao.impl包,UserDao接口的实现类UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
    Random random = new Random();
​
    public void insert() {
        try {
            Thread.sleep(1000+random.nextInt(500));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("添加用户信息");
    }
​
    public void delete() {
        try {
            Thread.sleep(1000+random.nextInt(500));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("删除用户信息");
    }
​
    public void update() {
        try {
            Thread.sleep(1000+random.nextInt(500));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("更新用户信息");
    }
​
    public void select() {
        try {
            Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("查询用户信息");
    }
}
3、配置Spring AOP

        applicationContext.xml

    <!--Spring IOC容器的注解扫描-->
    <context:component-scan base-package="com.sw"/>
4、测试业务功能

        com.sw.dao包,UserDaoImpl类方法创建测试,右键→Generate→Test

public class UserDaoImplTest {
​
    UserDao userDao;
​
    @Before
    public void setUp() throws Exception {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        userDao = applicationContext.getBean("userDaoImpl", UserDao.class);
    }
​
    @Test
    public void insert() {
        userDao.insert();
    }
​
    @Test
    public void delete() {
        userDao.delete();
    }
​
    @Test
    public void update() {
        userDao.update();
    }
​
    @Test
    public void select() {
        userDao.select();
    }
}
5、定义通知

        com.sw.pojo包,AnnoAdvice类

@Aspect
@Component
public class AnnoAdvice {
    private long startTime;
    private long endTime;
    Logger logger = Logger.getLogger(AnnoAdvice.class);
​
    //切入点
    @Pointcut("execution(* com.sw.dao.*.*(..))")
    public void pointCut(){}
​
    //前置通知
    @Before("pointCut()")
    public void before(JoinPoint jp){
        startTime = new Date().getTime();
    }
​
    @After("pointCut()")
    public void after(JoinPoint jp){
        endTime = new Date().getTime();
        //方法名
        String methodName = jp.getSignature().getName();
        //全限定类名
        String className = jp.getTarget().getClass().getName();
        logger.info(className+"."+methodName+",耗时:"+(endTime-startTime)+"毫秒");
    }​
}
6、开启AOP自动代理

        applicationContext.xml

    <!-- 开启AOP的自动代理 -->
    <aop:aspectj-autoproxy/>

三、更新需求

        实现dao层除查询以外方法的耗时统计。

1、修改通知

        com.sw.pojo包,AnnoAdvice类

    //切入点
    @Pointcut("execution(* com.sw.dao.*.delete*(..))" +
            "||execution(* com.sw.dao.*.update*(..))" +
            "||execution(* com.sw.dao.*.insert*(..))")
    public void pointCut(){}
2、测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇 士 Teacher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值