继上一篇的知识:接下来就根据下面这张图的,UserDao类的增、删、改、查方法,来进行对Spring通知的了解。
一、 Spring通知类型
1.1、前置通知:在目标方式执行之前的操作 获得切入点的信息
如: <!-- 配置切面 -->
<aop:aspect ref="myAspect">
<aop:before method="checkProxy" pointcut-ref="pointcut1"/>
</aop:aspect>
1.2、后置通知:在目标方式执行之后的操作 获得方法的返回值
1.3、环绕通知:在目标方式执行之前和之后的操作 可以阻止目标方法的执行,性能监控
1.4、异常抛出通知:在程序出现异常的时候,进行的操作
事务管理,事务开始、事务终止、事务异常
1.5、最终通知:无论代码是否异常,总会执行
1.6、引入通知:(了解)
二、AOP的开发(基于AspectJ的XML方式)
步骤:1、引入jar包
基本开发包
AOP的包(aop、aspects、expression、aspectj[依赖包])
2、创建XML文件,引入约束(:the aop schema ..............方法参见he context schema约)
3、编写目标类。增强(save、find、delete、update方法)
4、编写测试类 (介绍一个单元测试的方法............)
说明:对于ProductDao及ProductDaoImpl类的创建和实现参考上一篇
2、创建applicationContext.xml 文件
<!-- 配置目标对象:增强的对象 -->
<bean id="productDao" class="com.dao.Impl.ProductDaoImpl">
</bean>
<!-- 将权限校验类交给Spring管理 -->
<bean id="myAspect" class="com.domain.MyAspectXML">
</bean>
<!-- 通过AOP的配置完成对目标类产生代理 -->
<aop:config>
<!-- 表达式配置哪些类的那些方法需要增强 -->
<aop:pointcut id="pointcut1" expression="execution(* com.dao.Impl.ProductDaoImpl.save())"/>
<aop:pointcut id="pointcut2" expression="execution(* com.dao.Impl.ProductDaoImpl.delete())"/>
<aop:pointcut id="pointcut3" expression="execution(* com.dao.Impl.ProductDaoImpl.update())"/>
<aop:pointcut id="pointcut4" expression="execution(* com.dao.Impl.ProductDaoImpl.find())"/>
<!-- 配置切面 -->
<aop:aspect ref="myAspect">
<!--前置通知=============-->
<aop:before method="checkProxy" pointcut-ref="pointcut1"/>
<!-- 后置通知============= -->
<aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
<!-- 环绕知=============== -->
<aop:around method="around" pointcut-ref="pointcut3"/>
<!-- 异常通知========== -->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="ex"/>
<!-- 最终通知 -->
<aop:after method="after" pointcut-ref="pointcut4"/>
</aop:aspect>
</aop:config>
3、编写目标类。
略......................
4、增强(save、find、delete、update方法),基于AspectJ的方式,创建MyAspectXML类实现这些功能,而实现这些方法的关键就是实现对它的配置;
public class MyAspectXML {
/*=====================前置通知========================*/
public void checkProxy(JoinPoint joinPoint){
System.out.println("权限校验............."+joinPoint);
}
/*======================后置通知=======================*/
public void writeLog(Object result){
System.out.println("日志记录............."+result);
}
/*====================== 性能监控=======================*/
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕前通知===========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知===========");
return obj;
}
/*=====================异常抛出通知=========================*/
public void afterThrowing(Throwable ex){
System.out.println("异常抛出通知============="+ex.getMessage());
}
/*=========================最终通知========================*/
public void after(){
System.out.println("最终通知===========");
}
}
5、测试类 略...........................
三、2、Spring的切入点表达式的写法
<aop:pointcut id="pointcut1" expression="execution(* com.dao.Impl.ProductDaoImpl.save())"/>
基于一个execution的方法执行
语法:【访问修饰符】 方法的返回值 包名.类名.方法名(参数)
public void com.dao.userDao.save(..) 特定方法的增强
* :星号任意
* com.com.dao.userDao+save(..) 表示当前类和子类都可以增强
* com.com.dao.userDao.*.* 表示这个包类的所有方法增