Spring的使用(四):注解式AOP

步骤

  1. 切面配置进入容器
  2. 指定切面(切面添加@Aspect注解)
  3. 配置切入点
    a.拦截类 bean(xxx) 在容器中命名为xxx的类中所有方法都会被切入
    b.拦截方法 execution(* com.service.ProServiceImpl.*(…)) 【具体的位置可以用*代替,代表任意的意思】
  4. 配置通知 给指定的通知增加响应的注解

    配置通知的切入点
        a.直接配置切入规则 在注解的括号中使用value来指定规则
        b.引入切入点 引入之前配置好的切入点 引用的切入点是带pointcut注解的方法

  5. 打开aop注解式管理 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

示例

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.service"></context:component-scan>

    <context:component-scan base-package="com.aop"></context:component-scan>


    <!--自动打开注解式AOP-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>
@Component("myAspect")
@Aspect
public class MyAspect {

    /*自定义的切入点*/
    @Pointcut(value="bean(*Service)")
    public void xxx(){}

    @Pointcut(value = "execution(* com.service.ProServiceImpl.pro2(..))")
    public void guize(){}


    //前置通知
    @Before(value = "xxx()")
    public void beforeLogin(JoinPoint jointPoint){
        //方法名
        System.out.println("=============开始进入前置通知===============");
        System.out.println("拦截的方法名是===" + jointPoint.getSignature().getName());
        System.out.println("目标对象是==="+jointPoint.getTarget().getClass().getName());
        System.out.println("代理对象是====" + jointPoint.getThis().getClass().getName());
        System.out.println("当前方法的参数" + Arrays.toString(jointPoint.getArgs()));
        System.out.println("进入了方法前的时间是" + CommmonUtil.getTime());
        System.out.println("=============前置通知结束===============");
    }

    //后置通知
    @AfterReturning(value = "guize()",returning = "returnVal")
    public void afterRetuturningLogin(JoinPoint jointPoint,Object returnVal){
        System.out.println("=============开始进入后置通知===============");
        System.out.println("拦截的方法名是===" + jointPoint.getSignature().getName());
        System.out.println("目标对象是==="+jointPoint.getTarget().getClass().getName());
        System.out.println("代理对象是====" + jointPoint.getThis().getClass().getName());
        System.out.println("当前方法的返回值是" + returnVal);
        System.out.println("出方法的时间是" + CommmonUtil.getTime());
        System.out.println("=============后置通知结束===============");
    }

    //环绕通知(本质就是代理原来的方法)
    @Around(value = "guize()")
    public Object around(ProceedingJoinPoint jointPoint) throws Throwable {
        System.out.println("=============开始进入环绕通知===============");
        System.out.println("拦截的方法名是===" + jointPoint.getSignature().getName());
        System.out.println("目标对象是==="+jointPoint.getTarget().getClass().getName());
        System.out.println("代理对象是====" + jointPoint.getThis().getClass().getName());
        System.out.println("当前方法的参数" + Arrays.toString(jointPoint.getArgs()));
        System.out.println("进入了方法前的时间是" + CommmonUtil.getTime());
        Object returnVal = jointPoint.proceed();
        System.out.println("当前方法的返回值是" + returnVal);
        System.out.println("出方法的时间是" + CommmonUtil.getTime());
        System.out.println("=============环绕通知结束===============");
        return returnVal;
    }

    //异常通知
    public void afterThrowing(JoinPoint jointPoint,Throwable ex){
        System.out.println("=============开始进入异常通知===============");
        System.out.println("拦截的方法名是===" + jointPoint.getSignature().getName());
        System.out.println("目标对象是==="+jointPoint.getTarget().getClass().getName());
        System.out.println("代理对象是====" + jointPoint.getThis().getClass().getName());
        System.out.println("异常信息为=====" + ex.getMessage());
        System.out.println("异常时间是" + CommmonUtil.getTime());
        System.out.println("=============异常通知结束===============");
    }

    //异常通知
    public void after(JoinPoint jointPoint){
        System.out.println("=============开始进入最终通知===============");
        System.out.println("拦截的方法名是===" + jointPoint.getSignature().getName());
        System.out.println("目标对象是==="+jointPoint.getTarget().getClass().getName());
        System.out.println("代理对象是====" + jointPoint.getThis().getClass().getName());
        System.out.println("最终的时间是" + CommmonUtil.getTime());
        System.out.println("=============最终结束===============");
    }
}
@Service("proService")
public class ProServiceImpl implements IProService {
    @Override
    public void pro1() {
        System.out.println("pro1执行了");
    }

    @Override
    public void pro2() {
        System.out.println("pro2执行了");
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class TestAop {

    @Resource(name="userService")
    private IUserService service;

    @Resource(name="proService")
    private IProService proService;

    @Test
    public void test1(){
        proService.pro2();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值