spring-Aop by aspectj注解 (3) 万能的环绕通知

环绕通知可以把前置后置异常都涵盖,甚至权限要更大些,可以改方法返回值甚至选择不调用目标方法等。

1 定义通知

package cn.dbet.spring.aop.aspectj;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 观众
 */
@Aspect
public class AudienceAround {
    private static Logger logger = LoggerFactory.getLogger(AudienceAround.class);

    @Around("execution(* cn.dbet.spring.aop.aspectj.Performer.perform())")
    public Object watch(ProceedingJoinPoint pjp) {
        try {
            logger.info("takeSeat");
            logger.info("turnOffPhone");
            Object ret = pjp.proceed();//调用目标方法
            logger.info("applaud");
            return ret;
        } catch (Throwable e) {
            logger.info("payOff", e);
        } finally {
            logger.info("goHome");
        }
        return null;
    }
}

2 接口定义

package cn.dbet.spring.aop.aspectj;

/**
 * 演员
 */
public interface Performer {
    //表演
    public void perform();
}

3 目标对象定义

package cn.dbet.spring.aop.aspectj;

public class Singer implements Performer {

    public void perform() {
        System.out.println("action:i am a singer!i speak for myself !");
       /* String a = null;
        a.toString();*/
    }
}

4 配置文件 aspectjaround.xml

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- 观众切面 -->
    <bean class="cn.dbet.spring.aop.aspectj.AudienceAround">
    </bean>

    <!-- 目标对象 -->   
    <bean id="singer" class="cn.dbet.spring.aop.aspectj.Singer">
    </bean>

    <!-- aspectj自动代理 -->
    <aop:aspectj-autoproxy />
</beans>

5 测试类AppAround

package cn.dbet.spring.aop.aspectj;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppAround {

    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("aspectjaround.xml", AppAround.class);
        Performer p = (Performer) ac.getBean("singer");
        p.perform();

    }
}

6 测试结果

没有异常情况的测试结果:

2018-06-01 16:42:02 379  INFO AudienceAround:19 - takeSeat
2018-06-01 16:42:02 380  INFO AudienceAround:20 - turnOffPhone
action:i am a singeri speak for myself !
2018-06-01 16:42:02 380  INFO AudienceAround:22 - applaud
2018-06-01 16:42:02 380  INFO AudienceAround:27 - goHome

测试异常通知,把Singer 中异常注释放开

2018-06-01 16:29:02 646  INFO AudienceAround:19 - takeSeat
2018-06-01 16:29:02 646  INFO AudienceAround:20 - turnOffPhone
action:i am a singeri speak for myself !
2018-06-01 16:29:02 647  INFO AudienceAround:25 - payOff
java.lang.NullPointerException
.....
2018-06-01 16:29:02 648  INFO AudienceAround:27 - goHome

aspectj 注解 实现spring Aop 的入门学习就到这里了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值