环绕通知可以把前置后置异常都涵盖,甚至权限要更大些,可以改方法返回值甚至选择不调用目标方法等。
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 singer!i 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 singer!i 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 的入门学习就到这里了。