• Spring.net 间接调用被AOP拦截的方法失效(无法进入aop的拦截方法)


    1.下面的tx要定义
    <objects xmlns="http://www.springframework.net"
             xmlns:db="http://www.springframework.net/database"
              xmlns:tx="http://www.springframework.net/tx">
    2.启用事务切面和类型代理
      <tx:attribute-driven transaction-manager="TxManager"  proxy-target-type="true"  />
    3.使用代理工厂或者自动代理时要有这个属性,我注释起来给大家看下
    <!--   <property name="ExposeProxy" value="true"></property>-->,还有这个xml也相当于注册advisor
    <?xml version="1.0" encoding="utf-8" ?>
    <objects  xmlns="http://www.springframework.net"  
              xmlns:db="http://www.springframework.net/database"
              xmlns:tx="http://www.springframework.net/tx">
      <object name="autoProxyCreator1" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">
        <property name="InterceptorNames" value="transactionInterceptor"/>
        <property name="ExposeProxy" value="true"></property>
        <property name="ObjectNames">
          <list>
            <value>*Service</value>
            <value>*BLL</value>
            <!--拦截目标对象-->
          </list>
        </property>
        <property name="InterceptorNames">
          <list>
            <value>aroundAdvisor</value>
            <value>throwAdvisor</value>
            <value>prductGroupAdvisor</value>
            <value>beforeAdvisor</value>
          </list>
        </property>
      </object>
      <!--<object id="aroundAdvisor" type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Advice" ref="AroundAdvise"/>
        <property name="MappedNames">
          <list>
            <value>FindAll</value>
          </list>
        </property>
      </object>-->
    </objects>
    4.在间接调用有aop代理的方法的时候,这样写,虽然麻烦点但是有用,下面的saveorupdate方法是有用aop的
      if (AopContext.CurrentProxy != null)
                {
                         ((dynamic)AopContext.CurrentProxy).SaveOrUpdate(obj);
                }
                else
                {
                    SaveOrUpdate(obj);
                }
    5.顺便给出aop方法特性的定义以及saveorupdate方法的定义
        /// <summary>
        /// 前置通知
        /// </summary>
        [AttributeUsage(AttributeTargets.Method, Inherited = true)]
        public class BeforeInterceptorAttribute : Attribute
        {
        }
     [BeforeInterceptor]
            public override BasAssetClass SaveOrUpdate(BasAssetClass obj)
            {
                //这个名称已经被人用了,重复新增的时候
                bool exits = GetTotalCount(x => x.AssetClassName == obj.AssetClassName && x.Id != obj.Id) > 0;
                if (exits)
                {
                    throw new Exception("名称不能重复!!");
                }
                return base.SaveOrUpdate(obj); 
            }
    6.advisor具体定义的xml
    <?xml version="1.0" encoding="utf-8" ?>
    <objects  xmlns="http://www.springframework.net"
              xmlns:db="http://www.springframework.net/database"
              xmlns:tx="http://www.springframework.net/tx">
      <!--注意aroundAdvisor,aroundAdvisor1必须先在AopConfigInterceptor.xml注册-->
      <object id="aroundAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Advice" ref="AroundAdvise"/>
        <property name="Attribute"
                  value="AopBehavior.MethodInterceptorAttribute, AopBehavior" />
      </object>
       <object id="prductGroupAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Advice" ref="ProductGroupAroundAdvise"/>
        <property name="Attribute"
                  value="AopBehavior.ProductGroupAttribute, AopBehavior" />
      </object>
      <object id="throwAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Advice" ref="ThrowsAdvise"/>
        <property name="Attribute"
                  value="AopBehavior.ThrowExceptionAttribute, AopBehavior" />
      </object>
      <object id="beforeAdvisor" type="Spring.Aop.Support.AttributeMatchMethodPointcutAdvisor, Spring.Aop">
        <property name="Advice" ref="BeforeAdvise"/>
        <property name="Attribute"
                  value="AopBehavior.BeforeInterceptorAttribute, AopBehavior" />
      </object>
      <!--<object id="proxyFactoryObject" type="Spring.Aop.Framework.ProxyFactoryObject">
        <property name="Target">
          <object type="Bll.SysMenuOperationService, HRABLL" />
        </property>
        <property name="InterceptorNames">
          <list>
            <value>aroundAdvisor</value>
          </list>
        </property>
      </object>-->
    
    </objects>
  • 相关阅读:
    单片机中的类型转换
    vs2013CCyusb报错(CyAPI.obj)
    c/c++ 去掉空格函数
    keil关于正点原子的sys.h工程报错修改
    【C语言】华软C语言程序设计复习
    c/c++中,clock函数的用法和作用
    vs mfc出现错误“MSB8301”解决办法
    vs出现“未将对象引用到实例的错误”
    keil uv5 代码格式化
    嵌入式软件面试
  • 原文地址:https://www.cnblogs.com/kexb/p/6244243.html
Copyright © 2020-2023  润新知