zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/kexb/p/6244243.html
Copyright © 2011-2022 走看看