Spring中常见的各种通知
来源:互联网 发布:客如云餐饮软件 编辑:程序博客网 时间:2024/05/23 20:19
四、通知的创建通知有:前置通知、后置通知、环绕通知和异常通知;下面我们分别来看一下:1、创建PersonService接口:package cn.csdn.service;import java.util.Date;//抽象主题角色public interface PersonService {public void Study(String name,Date date);}2、创建实现PersonService接口的类: package cn.csdn.service;import java.util.Date;//主角public class PersonServiceBean implements PersonService{@Overridepublic void Study(String name, Date date) {System.out.println("学习的科目是"+name+"学习的时间是"+date);}} 3、配置bean.Xml文件<?xml version="1.0" encoding="UTF-8"?><beans xmlns=http://www.springframework.org/schema/beans xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" > <!-- 环绕通知 --> <bean id="myAroundAdvice" class="cn.csdn.advice.MyAroundAdvice"/> <!-- 配置前置通知 --> <bean id="myBeforeAdvice" class="cn.csdn.advice.MyBeforeAdvice"/> <!-- 配置后置通知 --> <bean id="myAfterAdvice" class="cn.csdn.advice.MyAfterAdvice"/> <!-- 配置异常通知 --> <bean id="myThrowsAdvice" class="cn.csdn.advice.MyThrowsAdvice"/> <!-- 引入通知 --> <bean id="auditableBean" class="cn.csdn.advice.AuditableBean"/> <!-- 业务bean --> <bean id="personServiceBean" class="cn.csdn.service.PersonServiceBean"/> <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--代理接口--> <property name="proxyInterfaces"> <list> <value>cn.csdn.service.PersonService</value> <value>cn.csdn.service.Auditable</value> </list> </property> <!--通知名称--> <property name="interceptorNames"> <list> <value>myAroundAdvice</value> <value>myBeforeAdvice</value> <value>myAfterAdvice</value> <value>auditableBean</value> </list> </property> <!--通知对象--> <property name="target"> <ref bean="personServiceBean"/> </property> </bean> </beans>4、前置通知的实现: package cn.csdn.advice;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class MyBeforeAdvice implements MethodBeforeAdvice{@Overridepublic void before(Method method, Object[] arg1, Object arg2)throws Throwable {//第一个参数方法对象// 方法参数//目标对象Object obj =null;if(arg1.length>0){obj= arg1[0];System.out.println("before-----------方法的名称:"+method.getName()+" 方法的第一个参数值"+obj.toString()+" 目标对象是:"+arg2.getClass());}}} 5、后置通知的实现: package cn.csdn.advice;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class MyAfterAdvice implements AfterReturningAdvice{@Overridepublic void afterReturning(Object returnValue, Method arg1, Object[] arg2,Object arg3) throws Throwable {//执行目标方法之后执行此操作System.out.println("after-------方法的返回值是:");}}6、环绕通知的实现:package cn.csdn.advice;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;public class MyAroundAdvice implements MethodInterceptor{@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println("执行前");Object object=methodInvocation.proceed();System.out.println("执行后");//ProxyFactoryBeanreturn object;}}7、异常通知的实现:package cn.csdn.advice;import java.lang.reflect.Method;import org.springframework.aop.ThrowsAdvice;public class MyThrowsAdvice implements ThrowsAdvice{//异常处理操作public void afterThrowing(Method method,Object[] args, Object target,Throwable throwable){ System.out.println("exception------"+throwable.getMessage());}}8、引入通知的实现:a)创建接口Auditable: package cn.csdn.advice;import java.util.Date;public interface Auditable {//添加一个属性 记录最后一次修改的时间的操作void setLastModifiedDate(Date laseModidiedDate);Date getLastModifiedDate();}b)创建实现Auditable接口的类: package cn.csdn.advice;import java.util.Date;import org.springframework.aop.support.DelegatingIntroductionInterceptor;public class AuditableBean extends DelegatingIntroductionInterceptor implements Auditable{private Date laseModidiedDate;@Overridepublic void setLastModifiedDate(Date laseModidiedDate) {this.laseModidiedDate=laseModidiedDate;}@Overridepublic Date getLastModifiedDate() {return laseModidiedDate;}}9、测试类(AppMain): package cn.csdn.junit;import java.util.Date;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.csdn.advice.Auditable;import cn.csdn.service.PersonService;public class AppMain {@Testpublic void test() {ApplicationContext context=new ClassPathXmlApplicationContext("classpath:bean.xml");PersonService pService=(PersonService) context.getBean("proxyFactoryBean");pService.Study("java",new Date()); Auditable au = (Auditable)pService; au.setLastModifiedDate(new Date()); System.out.println(au.getLastModifiedDate());}} 10、测试结果:执行前before-----------方法的名称:Study 方法的第一个参数值java 目标对象是:class cn.csdn.service.PersonServiceBean学习的科目是java学习的时间是Wed Apr 18 21:03:55 CST 2012after-------方法的返回值是:null执行后执行前before-----------方法的名称:setLastModifiedDate 方法的第一个参数值Wed Apr 18 21:03:55 CST 2012 目标对象是:class cn.csdn.service.PersonServiceBeanafter-------方法的返回值是:null执行后执行前after-------方法的返回值是:Wed Apr 18 21:03:55 CST 2012执行后Wed Apr 18 21:03:55 CST 2012