Spring中的5种通知
前置通知:
Code:
/**
* 前置通知:执行方法之前调用。前置通知类需要实现MethodBeforeAdvice接口
* */
public class EmpBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method arg0, Object[] arg1, Object target)
throws Throwable {
System.out.println("这里是before方法");
System.out.println("方法的名字:"+arg0+"方法的参数:"+arg1.length+"目标对象:"+target);
System.out.println("===================");
}
}
后置通知:
Code:
/**
* 后置通知:调用完方法之后调用,后置通知类要实现AfterReturningAdvice接口
* */
public class EmpAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object target) throws Throwable {
// TODO Auto-generated method stub
System.out.println("这里是afterReturning方法!");
System.out.println("返回的对象:" + arg0 + "调用的方法的名字:" + arg1 + "方法的参数:"
+ arg2.length + "目标对象:" + target);
System.out.println("======================");
}
}
环绕通知:
Code:
/**
* 环绕通知:在调用方法的前后调用.该类需要继承MethodInterceptor接口
* */
public class EmpReturning implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// TODO Auto-generated method stub
System.out.println("invoke方法的开始");
Object obj=arg0.proceed();//让他执行目标方法
System.out.println("invoke方法的结束");
System.out.println("=====================");
return obj;//如果返回的是null的话,就会报错
}
}
异常通知:
Code:
/**
* 异常通知:当执行目标类发生异常时,执行该通知。该类继承了ThrowingAdivice接口
* */
public class EmpException implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args, Object target,
Exception ex) {
System.out.println("这里是afterThrowing方法!");
System.out.println("调用方法的名字是:" + method + "方法的参数的个数:" + args.length
+ "调用的目标对象:" + target + "抛出的异常:" + ex);
System.out.println("================");
}
}
引用通知:待写
3种加载通知的方式
用代理类加载方式:
Code:
<!-- 前置通知 -->
<bean id="empBeforeAdvice" class="cn.csdn.aop.EmpBeforeAdvice" />
<!-- 后置通知(方法的操作之后进行处理) -->
<bean id="empAfterAdvice" class="cn.csdn.aop.EmpAfterAdvice" />
<!-- 环绕通知(方法执行前后处理) -->
<bean id="empReturning" class="cn.csdn.aop.EmpReturning" />
<!-- 异常通知(方法执行期间出现bug的时候) -->
<bean id="empException" class="cn.csdn.aop.EmpException" />
<!-- 目标类 -->
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl">
<property name="worktime">
<value>my worktime is 8 hours!</value>
</property>
</bean>
<!-- 配置一个静态的advisor -->
<bean id="slbeforeadvistor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empBeforeAdvice"></property>
<property name="mappedNames">
<list>
<value>sleep</value>
</list>
</property>
</bean>
<!-- 配置另一个静态的advisor -->
<bean id="wkaroundAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empReturning"></property>
<property name="mappedNames">
<list>
<value>work</value>
</list>
</property>
</bean>
<!-- 代理-->
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 设置代理的名称proxyInterfaces -->
<property name="proxyInterfaces">
<list>
<value>cn.csdn.service.EmpService</value>
</list>
</property>
<!-- 拦截的名称 -->
<property name="interceptorNames">
<list>
<!--在这定义那个通知,就加载那个通知
<value>empBeforeAdvice</value> <value>empAfterAdvice</value>
<value>empReturning</value> <value>empException</value>
-->
<value>slbeforeadvistor</value>
<value>wkaroundAdvisor</value>
</list>
</property>
<!-- 目标对象 -->
<property name="target" ref="empServiceImpl" />
</bean>
默认的自动加载通知:
Code:
<!-- 前置通知 -->
<bean id="empBeforeAdvice" class="cn.csdn.aop.EmpBeforeAdvice" />
<!-- 后置通知(方法的操作之后进行处理) -->
<bean id="empAfterAdvice" class="cn.csdn.aop.EmpAfterAdvice" />
<!-- 环绕通知(方法执行前后处理) -->
<bean id="empReturning" class="cn.csdn.aop.EmpReturning" />
<!-- 异常通知(方法执行期间出现bug的时候) -->
<bean id="empException" class="cn.csdn.aop.EmpException" />
<!-- 目标类 -->
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl">
<property name="worktime">
<value>my worktime is 8 hours!</value>
</property>
</bean>
<!-- 配置一个静态的advisor -->
<bean id="slbeforeadvistor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empBeforeAdvice"></property>
<property name="mappedNames">
<list>
<value>sleep</value>
</list>
</property>
</bean>
<!-- 配置另一个静态的advisor -->
<bean id="wkaroundAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empReturning"></property>
<property name="mappedNames">
<list>
<value>work</value>
</list>
</property>
</bean>
<!-- 声明引入的通知 -->
<bean id="modifyDateImpl" class="cn.csdn.service.ModifyDateImpl" />
<!-- 引入通知配置一个advisor -->
<bean id="DefaultIntroductionAdvisor"
class="org.springframework.aop.support.DefaultIntroductionAdvisor">
<constructor-arg ref="modifyDateImpl"></constructor-arg>
</bean>
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
Nameauto:
Code:
<!-- 前置通知 -->
<bean id="empBeforeAdvice" class="cn.csdn.aop.EmpBeforeAdvice" />
<!-- 后置通知(方法的操作之后进行处理) -->
<bean id="empAfterAdvice" class="cn.csdn.aop.EmpAfterAdvice" />
<!-- 环绕通知(方法执行前后处理) -->
<bean id="empReturning" class="cn.csdn.aop.EmpReturning" />
<!-- 异常通知(方法执行期间出现bug的时候) -->
<bean id="empException" class="cn.csdn.aop.EmpException" />
<!-- 目标类 -->
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl">
<property name="worktime">
<value>my worktime is 8 hours!</value>
</property>
</bean>
<!-- 配置一个静态的advisor -->
<bean id="slbeforeadvistor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empBeforeAdvice"></property>
<property name="mappedNames">
<list>
<value>sleep</value>
</list>
</property>
</bean>
<!-- 配置另一个静态的advisor -->
<bean id="wkaroundAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="empReturning"></property>
<property name="mappedNames">
<list>
<value>work</value>
</list>
</property>
</bean>
<!-- 声明引入的通知 -->
<bean id="modifyDateImpl" class="cn.csdn.service.ModifyDateImpl" />
<!-- 引入通知配置一个advisor -->
<bean id="DefaultIntroductionAdvisor"
class="org.springframework.aop.support.DefaultIntroductionAdvisor">
<constructor-arg ref="modifyDateImpl"></constructor-arg>
</bean>
<!-- 根据名字自动代理 -->
<bean id="beanNameAutoProxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 目标对象 -->
<property name="beanNames">
<value>empServiceImpl</value>
</property>
<!--拦截的名称 -->
<property name="interceptorNames">
<list>
<!--
<value>empBeforeAdvice</value> <value>empAfterAdvice</value>
<value>empReturning</value> <value>empException</value>
-->
<value>wkaroundAdvisor</value>
<value>DefaultIntroductionAdvisor</value>
</list>
</property>
</bean>