1 Spring的通知类型
1.1前置通知:在目标方法执行之前进行操作(aop:before)
- 前置通知:获得切入点信息
1.2后置通知:在目标方法执行之后进行操作(aop:after-returning)
- 配置(返回后的参数要与WRITELOG的参数名相同)
<aop:config>
<!-- 表达式配置哪些类型的方法需要增强 -->
<aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.delete(..))\" id=\"pointCut2\" returning=\"result\"/>
<!-- 配置切面 -->
<aop:aspect ref=\"myAspect\">
<aop:after-returning method=\"writeLog\" pointcut-ref=\"pointCut2\"/>
</aop:aspect>
</aop:config>
- WRITELOG方法需要提供一个Ojbect类型的参数,并且名字与配置文件中的恢复中的相同
public void writeLog(Object result) {
System.out.println(\"写日志....\"+result);
}
- 删除方法(这时WRITELOG中的结果参数将变成“永康达”)
public String delete() {
System.out.println(\"UserDaoImpl的delete方法执行了.....\");
return \"ykd\";
}
1.3环绕通知:在目标方法执行之前和之后进行操作(aop:around)
- 通知环绕可以阻止目标方法的执行
- MyAspectXML类中添加的环绕方法:(1)返回类型必须是对象 ;(2)joinPoint.proceed()方法相当于执行目标程序 ;
- 配置
<aop:config>
<!-- 表达式配置哪些类型的方法需要增强 -->
<aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.update(..))\" id=\"pointcut3\" />
<!-- 配置切面 -->
<aop:aspect ref=\"myAspect\">
<aop:around method=\"surround\" pointcut-ref=\"pointcut3\"/>
</aop:aspect>
</aop:config>
- 围绕方法(返回类型必须是对象)
public Object surround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(\"环绕前通知........\");
Object obj = joinPoint.proceed();
System.out.println(\"环绕后通知........\");
return obj;
}
1.4异常抛出通知:在程序出现异常的时候进行的操作,比如事务的操作(aop:after-throwing)
- 配置
<aop:config>
<!-- 表达式配置哪些类型的方法需要增强 -->
<aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.find(..))\" id=\"pointcut4\" />
<!-- 配置切面 -->
<aop:aspect ref=\"myAspect\">
<aop:after-throwing method=\"afterThrowing\" pointcut-ref=\"pointcut4\" throwing=\"ex\"/>
</aop:aspect>
- afterThrowinig方法,必须要有一个的Throwable的参数,上述配置文件中投掷=“EX”要与Throwable的的参数前要相同
public void afterThrowing(Throwable ex) {
System.out.println(\"异常抛出通知.....\"+ex);
}
1.5最终通知:无论代码是否有异常,总会执行,这就类似于finally块(aop:after)
<aop:config>
<!-- 表达式配置哪些类型的方法需要增强 -->
<aop:pointcut expression=\"execution(* com.itykd.dao.impl.UserDaoImpl.find(..))\" id=\"pointcut5\" />
<!-- 配置切面 -->
<aop:aspect ref=\"myAspect\">
<aop:after method=\"finalMethod\" pointcut-ref=\"pointcut5\" />
</aop:aspect>
1.6 引介通知
2 Spring切入点表达式写法
- 基于execution的函数完成的
- 语法
- [访问修饰符] 方法返回值 包名.类名.方法名(参数) []代表的是可选,注意有的之间是有空格的,是不能省略的:public void com.itykd.spring.CustomerDao.save(..)
- * *.*.*.*Dao.save(..) *代表的是通配符,但是方法参数中通配符使用..,而不是*
- * com.itykd.spring.CustomerDao+.save(..) “+”代表的是CustomerDao以及它的子类
- * com.itykd.spring..*.*(..) “..”代表的是spring以及它的子包
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。


