AOP (面向切面编程) :在程序运行时,动态的将代码块切入到某个类的某个方法的某个位置(前面、后面、发生异常时)上。
前置通知:在某个方法之前执行
后置通知:在某个方法之后执行
异常通知:在某个方法发生异常时执行
环绕通知:可以在方法之前、之后、发生异常时执行!
最终通知:不论目标方法是否发生异常都会执行
切点和切面:切点是:在目标方法之前这个点、目标方法之后这个点、在目标方法发生异常这个点
切面是:在切点执行的代码块。
环绕通知:
可以获取目标方法的 完全控制权!(方法是否执行、控制参数、控制返回值)
在使用环绕通知时,目标方法的一切信息,都可以通过invocation(invoke方法传进去的参数名称)参数获取到
public class SurroundMethod implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) {
Object result = null;
try {
System.out.println("环绕通知里面的【前置通知】。。。");
result = invocation.proceed(); //这里相当于执行目标方法 如果不写目标方法就不会执行
// result是目标方法的返回值
System.out.println("环绕通知里面的【后置通知】...");
} catch (Throwable e) {
System.out.println("这里是执行环绕通知里面的【异常通知】。。。");
e.printStackTrace();
} finally{
System.out.println("这里是执行环绕通知里面的【最终通知】");
}
return result;
//也可以返回其他 return “123”; 那么目标方法的返回值就是 "123"
}
}
在applicationContext.xml文件中的配置 然后执行目标方法
<bean></bean> 首先目标方法所在的类和环绕通知所在类要写进来
<aop:config>
<aop:pointcut expression="execution(【这里是目标方法的具体信息】public * com.service.AddStudent.addStudent())" id="addStudent1"/>
<aop:advisor advice-ref="interceptMethod" pointcut-ref="addStudent1"/>
</aop:config>