Spring通过xml文件配置AOP,before、after、around、AfterThrowing、AfterReturning、Declare-parents

1 引包

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2 aop:面向切面的编程,就是在顺序执行的程序中打断原本顺序,先执行一个插入的程序
3 切面编程可能会使用的地方
monitor监听请求次数、响应时间响应时间
权限管理、表单验证、事务管理、信息过滤、拦截器、过滤器、页面转发
3 aop的优点:减少重复代码,减少对业务代码的入侵
例如我需要监听一个项目里所有方法的执行时间,那么就要在每个方法执行之前做一个当前时间的记录;方法执行之后做一个时间的记录,用2个时间计算当前方法的耗时,这样就要给所有的方法添加时间监控,并且原本的业务代码没有监控,现在回因为添加监控制造一个大的缺陷
4 如何实现aop
创建一个切面的类

import java.util.Date;
public class Halder {
public void startTime(){
    System.out.println("开始时间"+new Date());
}
public void endTime(){
    System.out.println("结束时间"+new Date());
}

}
5 将该类用myAop.xml文件加入spring容器中托管

<bean id="halder" class="com.longteng.lesson2.my.service.Halder"></bean>

6 创建一个业务类UserDaoTest ,也用myAop.xml加入spring容器中

public class UserDaoTest {
public String add(String name,Integer age){
    return name+age;
}
}

<bean id="userDaoTest" class="com.longteng.lesson2.my.UserDaoTest"></bean>

7 在myAop.xml文件中配置aop

<aop:config>
    <!--id就是给这个切入的方法起个名字,ref就是要哪个类切入,就是上面的Halder类的beanid-->
    <aop:aspect id="aa" ref="halder">
        <!--id是触发条件的名字,expression在执行UserDaoTest类的add方法的时候触发Halder切面类介入的表达式-->
        <!--括号里第一个星号与包名之间有个空格,add方法里有2个参数所以用两个星号代替,中间用逗号隔开-->
        <!--若表达式里的方法有多个参数就用多个星号,若没有参数就不用加任何星号-->
        <!--若是把add改成星号,意思就时执行userDaoTest类的任何方法都进入切面,每个方法的参数个数要一致才能这样写-->
        <aop:pointcut id="addMethod" expression="execution(* com.longteng.lesson2.my.UserDaoTest.add(*,*))"/>
        <!--在触发条件表达式之前执行,执行halder类里的startTime方法,pointcut-ref能触发条件的名字-->
        <aop:before method="startTime" pointcut-ref="addMethod"></aop:before>
        <!--在触发条件表达式之后执行,执行halder类里的endTime方法,pointcut-ref能触发条件的名字-->
        <aop:after method="endTime" pointcut-ref="addMethod"></aop:after>
    </aop:aspect>
</aop:config>

8 测试类启动容器,执行测试

public class Test {
ApplicationContext context;
@BeforeClass
public void beforeTest() {
    context=new ClassPathXmlApplicationContext("myAop.xml");
}
@org.testng.annotations.Test
public void test(){
    UserDaoTest userDaoTest=(UserDaoTest) context.getBean("userDaoTest");
    userDaoTest.add("xx",10 );
    }
}

9 执行结果

在这里插入图片描述](https://img-blog.csdnimg.cn/20190407140844987.png
这个时间的打印是从切面类Halder里打印的

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值