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>