版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/80551748
通过上篇博客 HelloWorld(AOP篇),相信大家已经对 AOP编程 有了一个简单的认识,本篇将学习 AOP 中的五大通知。在 AOP详解 这篇博客中的 AOP术语 这一小节已经介绍过了什么是通知,通知用一句话概括就是切面类中的方法,每种通知都会在目标方法的不同位置执行。
配置通知所需jar包:
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
前置通知(Before): 在目标方法开始前执行;
后置通知(After): 在目标方法执行后执行(发生异常也会执行);
返回通知(AfterReturning): 在目标方法正常结束后执行,能够获得该目标方法的返回值;
异常通知(AfterThrowing): 在目标方法出现异常时执行,能够获得异常信息,也可以指定在出现特定异常时再执行此通知。
@Component
public class HelloWorld {
public int hello() {
System.out.println("我是hello()方法!!!");
return 1;
}
}
@Aspect
@Component
public class Time {
@Before("execution(public int com.demo.HelloWorld.hello())")
public void beforeTime(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName(); // 目标方法名
List
注: JoinPoint 是切入点类,该类封装了目标方法(这里的目标方法也就是切入点)的信息,从这个类中可以获得目标方法的参数列表、方法名、以及所属类的Class等信息。
<context:component-scan base-package="com.demo" />
<aop:aspectj-autoproxy />
// 1、创建 Spring 的 IOC 容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
// 2、从 IOC 容器中获取 bean 实例
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
// 3、调用 hello方法
helloWorld.hello();
public class HelloWorld {
public void hello() {
System.out.println("我是hello()方法!!!");
}
}
public class Time {
public void beforeTime(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName(); // 目标方法名
List
<bean id="helloWorld" class="com.demo.HelloWorld">bean>
<bean id="time" class="com.demo.Time">bean>
<aop:config>
<aop:aspect ref="time">
<aop:before method="beforeTime" pointcut="execution(public int com.demo.HelloWorld.hello())" />
<aop:after method="afterTime" pointcut="execution(public int com.demo.HelloWorld.hello())" />
<aop:after-returning method="returnTime" returning="result" pointcut="execution(public int com.demo.HelloWorld.hello())" />
<aop:after-throwing method="throwTime" throwing="e" pointcut="execution(public int com.demo.HelloWorld.hello())" />
aop:aspect>
aop:config>
// 1、创建 Spring 的 IOC 容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
// 2、从 IOC 容器中获取 bean 实例
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
// 3、调用 hello方法
helloWorld.hello();
如果在目标方法中发生异常,比如 除0异常,会有以下效果:
环绕通知(Around): 围绕着目标方法执行,相当于是以上四大通知的集合。(一般很少使用)
@Component
public class HelloWorld {
public int hello() {
System.out.println("我是hello()方法!!!");
return 1;
}
}
@Aspect
@Component
public class Time {
@Around("execution(public int com.demo.HelloWorld.hello())")
public Object aroundTime(ProceedingJoinPoint pjd) {
// 返回值
Object result = null;
// 方法名
String methodName = pjd.getSignature().getName();
// 参数列表
List
<context:component-scan base-package="com.demo" />
<aop:aspectj-autoproxy />
// 1、创建 Spring 的 IOC 容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
// 2、从 IOC 容器中获取 bean 实例
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
// 3、调用 hello方法
helloWorld.hello();
public class HelloWorld {
public void hello() {
System.out.println("我是hello()方法!!!");
}
}
public class Time {
public Object aroundTime(ProceedingJoinPoint pjd) {
// 返回值
Object result = null;
// 方法名
String methodName = pjd.getSignature().getName();
// 参数列表
List
<bean id="helloWorld" class="com.demo.HelloWorld">bean>
<bean id="time" class="com.demo.Time">bean>
<aop:config>
<aop:aspect ref="time">
<aop:around method="aroundTime" pointcut="execution(public int com.demo.HelloWorld.hello())" />
aop:aspect>
aop:config>
// 1、创建 Spring 的 IOC 容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("bean.xml");
// 2、从 IOC 容器中获取 bean 实例
HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
// 3、调用 hello方法
helloWorld.hello();
如果在目标方法中发生异常,比如 除0异常,会有以下效果: