本帖最后由 cqzj119 于 2012-01-28 15:23:10 编辑

解决方案 »

  1.   

    刚才发现,在事物管理的AOP中也有这个问题
    也就是说,如果是在一个类中的一个方法A,调用本类中的另一个方法B,则方法B也不会被当做另一个事物来处理。如,public ClassA {
        public void methodA() {
            // ...一些DB操作        // 调用另一方法
            mothodB();
        }    public void methodB() {
            // ...一些DB操作
        }
    }事务切片为ClassA的所有方法,这时调用ClassA.methodA, 则这里只有一个事务
    但是如果,代码是这样,public ClassA {
        @Resource
        ClassB classB;    public void methodA() {
            // ...一些DB操作        // 调用ClassB的另一方法
            classB.mothodA();
        }
    }public ClassB {
        public void methodA() {
            // ...一些DB操作
        }
    }事务切片为ClassA和ClassB的所有方法,这时调用ClassA.methodA, 则这里就有两个事务。有人知道怎么让第一种情况,也成为两个事务吗?
      

  2.   

    你应该看下代理规则,你在某方法里调另外各方法,另外各方法不是proxy的形式
      

  3.   


    public void methodAB() {
            logger.debug("AopTest.methodAB()");
            methodA();
            methodB();
        }调用methodAB()方法的是代理对象, methodA();methodB();这2个方法是AopTest对象本身,所以就不能拦截了。
      

  4.   

    那有办法,然后methodA()和methodB()也被拦截吗?
      

  5.   

    问题 关键是方法A掉方法B时所用的对象不是由spring产生的,就无法拦截,如下你将方法A调用方法B所需的对象由spring产生就可以了。
    public class AopTest {
        private static final Logger logger = Logger.getRootLogger();    //self对象也是由spring注入    private AopTest self;
        public void methodA() {
            logger.debug("AopTest.methodA()");
        }
        
        public void methodB() {
            logger.debug("AopTest.methodB()");
        }
        
        public void methodAB() {
            logger.debug("AopTest.methodAB()");
            self.methodA();
            self.methodB();
        }
    }
      

  6.   

    public class AopTest {
      private static final Logger logger = Logger.getRootLogger();  //self对象也是由spring注入 private AopTest self;
      private AopTest self  public void methodA() {
          logger.debug("AopTest.methodA()");
      }
        
      public void methodB() {
          logger.debug("AopTest.methodB()");
      }
        
      public void methodAB() {
          logger.debug("AopTest.methodAB()");
          self.methodA();
          self.methodB(); 
      }}
      

  7.   

    谢谢楼上二位,ss36290109 给出了原因,liuqian34761 给出了solution,问题解决了,散分,
    root cause得15分
    solution得25分