Spring中的5种通知和3种加载通知的方式

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值