spring AOP中提供了三类Advice,即前增强,后增强,抛出异常时的增强 知道的,都说说,我也在百度,google,如果明白的,讲讲,一定要详细,白话文,能听懂,零基础想会用,先会用再再深入。人人都有分,不带保留的回复,谢谢,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 顾名思义:前置是在有这种调用目标方法的企图时就会干预。A extends TargetClass { public void targetMethod() { beforeAdvice(); super.targetMethod(); }}后置是在调用正常返回时才干预。A extends TargetClass { public void targetMethod() { super.targetMethod(); afterAdvice(); }}异常时调用后得到一个异常才干预。A extends TargetClass { public void targetMethod() { try { super.targetMethod(); } catch (ExpectedException e){ afterExceptionAdvice(); } }}AspectJ (另一种 AOP) 它还支持 Spring AOP 在 JDK 1.5 之前不支持的特性 - Around Advice,Around Advice 是对这个方法进行推断,满足你的条件才调用,不满足条件时可以跳过原来的方法,但当然该返回什么类型的值你的 advice 还是得照样返回,比如你返回一个 null 或 throw 一个签名中允许的异常,根据你的需要决定。A extends TargetClass { public void targetMethod() { if (expectedCondition == true) { super.targetMethod();// 用 AspectJ 来写是 proceed(); } else { // do nothing. } }}比如:下面这个是 AspectJ 的写法:void around(): updateBalance() { String account = (String) thisJoinPoint.getArgs()[0]; BigDecimal balance = (BigDecimal) thisJoinPoint.getArgs()[1]; if (account == null || account.equals("0") || balance == null || balance.signnum() == -1) { throw new IllegalArgumentException("Invalid account"); } else { proceed(); // 调用原来的方法。 } }Spring 没提供 Around Advice 因为它不方便像 AspectJ 那样还可以写一段代码来决定是否 proceed。AspectJ 的特点是它直接个性编译后的字码或在类加载过程中修改字节码,使得它可以实现更多的功能,比如它能够为“将要访问一个字段的值”提供 advice (不是调用 getter 方法),还支持 introduction (比如,为一个本来没有实现 Serializable 接口的类实现 Serializable 接口,或为一个类添加成员方法或变量),当然修改字节码这个事情也没办法给构造函数来个 advice 了。 如何用java判断浏览器类型? JPA的问题 16进制ascii码转换成汉字 dom4j解析xml文档时的字符引用(数字实体)问题及初步分析。 请教J2EE环境疑问,请前辈看看我的说法对不对 关于javamail的问题,困扰我一段时间了,求教!!! hibernate查询字段为null记录的问题,急 !!!! 经典问题,紧急求救!!! Session Bean中使用Resultset错误 提议:开个新版,把ejb/j2ee从java划出去。专门讨论ejb/j2ee方面的知识。 Struts2初次配置启动tomcat出错 求解——一面试题问题
前置是在有这种调用目标方法的企图时就会干预。
A extends TargetClass {
public void targetMethod() {
beforeAdvice();
super.targetMethod();
}
}
后置是在调用正常返回时才干预。
A extends TargetClass {
public void targetMethod() {
super.targetMethod();
afterAdvice();
}
}异常时调用后得到一个异常才干预。
A extends TargetClass {
public void targetMethod() {
try {
super.targetMethod();
} catch (ExpectedException e){
afterExceptionAdvice();
}
}
}
AspectJ (另一种 AOP) 它还支持 Spring AOP 在 JDK 1.5 之前不支持的特性 - Around Advice,
Around Advice 是对这个方法进行推断,满足你的条件才调用,不满足条件时可以跳过原来的方法,但当然该返回什么类型的值你的 advice 还是得照样返回,比如你返回一个 null 或 throw 一个签名中允许的异常,根据你的需要决定。A extends TargetClass {
public void targetMethod() {
if (expectedCondition == true) {
super.targetMethod();// 用 AspectJ 来写是 proceed();
} else {
// do nothing.
}
}
}比如:下面这个是 AspectJ 的写法:void around(): updateBalance() {
String account = (String) thisJoinPoint.getArgs()[0];
BigDecimal balance = (BigDecimal) thisJoinPoint.getArgs()[1]; if (account == null || account.equals("0")
|| balance == null || balance.signnum() == -1) {
throw new IllegalArgumentException("Invalid account");
} else {
proceed(); // 调用原来的方法。
}
}Spring 没提供 Around Advice 因为它不方便像 AspectJ 那样还可以写一段代码来决定是否 proceed。AspectJ 的特点是它直接个性编译后的字码或在类加载过程中修改字节码,使得它可以实现更多的功能,比如它能够为“将要访问一个字段的值”提供 advice (不是调用 getter 方法),还支持 introduction (比如,为一个本来没有实现 Serializable 接口的类实现 Serializable 接口,或为一个类添加成员方法或变量),当然修改字节码这个事情也没办法给构造函数来个 advice 了。