spring五种通知类型(四)

2014-11-24 09:21:59 · 作者: · 浏览: 10
ut"/>
returning="retVal"
pointcut-ref="servicepointcut"/>
throwing="ex"
pointcut-ref="servicepointcut"/>
i. 修改UserServiceImpl
[java]
package tarena.service;
public class UserServiceImpl implements UserService {
public void delete() {
System.out.println("删除用户信息");
//模拟NullPointException
String s = null;
s.length();
}
public boolean save() {
System.out.println("保存用户信息");
return true;
}
public void update() {
System.out.println("更新用户信息");
}
}
j. 运行Test1
5) 最终通知
a. 修改AopBean
[java]
package tarena.aop;
public class AopBean {
//前置通知方法
public void mybefore(){
System.out.println("--前置通知--");
}
//后置通知方法
public void myafterReturning(Object retVal){
System.out.println("--后置通知--" + retVal);
}
//异常通知方法
public void myafterException(Exception ex){
System.out.println("--异常通知begin--");
ex.printStackTrace();
System.out.println("--异常通知end--");
}
//最终通知
public void myafter(){
System.out.println("--最终通知--");
}
}
6) 修改aop.xml
[html]
class="tarena.service.UserServiceImpl">
expression="within (tarena.service.*)" />
pointcut-ref="servicepointcut"/>
returning="retVal"
pointcut-ref="servicepointcut"/>
throwing="ex"
pointcut-ref="servicepointcut"/>
pointcut-ref="servicepointcut"/>
7) 运行Test1
注意:最终通知丌论是否发生异常都会执行
通知的基本使用就是如此,
环绕通知在OptLogger中已经讲过了。
(案例结束)
4. 切入点表达式 *
下载Spring2.5 Reference中文版.zip(注:.chm文件,请在windows系统下查看)
参考Spring FrameWork 开发参考手册
核心技术 -- 使用Spring进行面向切面 编程 -- @AspectJ支持
打开6.2.3.4. 实例,可以查看到切入点表达式实例,
常用的都已经在文档中提供,请参考学习。
切入点表达式用于指定目标对象及其作用位置。
1) execution方法限定
execution(modifiers-pattern
ret-type-pattern
declaring-type-pattern
name-pattern(param-pattern)
throws-pattern )
execution(public * *(..))
表示无要求,只要是public修饰的方法就行
execution(* set*(..))
只要以set打头的方法,就可以。
execution(* com.xyz.service.AccountService.*(..))
匹配是介个类com.xyz.service.AccountService.*(..)下的所有方法
execution(* com.xyz.service.*.*(..))
匹配com.xyz.service介个包下的所有方法
execution(* com.xyz.service..*.*(..))
注意这个和上面的很像,就多个点儿,表示service及其子包下所有方法
(上面的丌包括子包)
2) within类型限定
within(com.xyz.service.AccountService)
限定com.xyz.service.AccountService类中所有方法
和execution(* com.xyz.service.AccountService.*(..))效果相同
within(com.xyz.service.*)
限定com.xyz.service包下的所有方法(丌包含子包)
within(com.xyz.service..*)
限定com.xyz.service包下的所有方法(包含子包)
3) this/target特定类型限定
实现AccountService接口的代理对象的任意连接点
this(com.xyz.service.AccountService)
实现AccountService接口的目标对象的任意连接点
target(com.xyz.service.AccountService)
注意this和target的区别
4) args方法参数类型限定
任何一个只接受一个参数,并且运行时所传入的参数是Serializable接口
args(java.io.Serializable)
5) bean对Bean对象名称限定
匹配bean对象名称以service结尾的对象bean(*service)
【课堂练习1】记录异常日志 **
1) 使用【案例1】项目spring2
2) 导入log4j的jar包
请下载log4j-1.2.11.zip
3) 新建log4j.properteis
[plain]
log4j.rootLog