1

我有一个有几个方法的类,该类的接口看起来像这样

一些主程序调用doSomeOperation方法,该方法又根据业务规则调用类中的其他方法。我有一种情况,在调用此类中的某些方法后,我必须填充一些统计信息。

例如,在调用 doSomeOperation 之后又调用 doOps1,在数据库中填充一些统计表,指示在特定表中插入/更新/删除了多少记录等,以及通过 doOps1 方法花费了多少时间等。我正在尝试为此目的使用 Spring AOP。但是,我面临的问题是没有调用预期的代码。

这是完整的代码(仅供示例)

 package spring.aop.exp;

public interface Business {
    void doSomeOperation();        
    void doOps1();
}

package spring.aop.exp;

public class BusinessImpl implements Business {

    public void doSomeOperation() {
            System.out.println("I am within doSomeOperation");
            try {
                    Thread.sleep(200);
            } catch (InterruptedException e) {
                    System.out.println("Thread interrupted");
            }
            System.out.println("Done with sleeping.");
            doOps1();
    }

    public void doOps1() {
        System.out.println("within Ops1");
    }               

}

方面类

package spring.aop.exp;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class BusinessProfiler {

        @Pointcut("execution(* doOps1*(..))")
        public void businessMethods1() { }


        @After("businessMethods1()")
         public void profile1() throws Throwable {
            //this method is supposed to populate the db stats and other statistics

            System.out.println("populating stats");

        }

}

-- 主类

package spring.aop.exp;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringAOPDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                ApplicationContext context = new ClassPathXmlApplicationContext(
                                "ExpAOP.xml");
                Business bc = (Business) context.getBean("myBusinessClass");
                bc.doSomeOperation();                   
        }

}

*和配置文件***

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

        <!-- Enable the @AspectJ support -->
        <aop:aspectj-autoproxy />

        <bean id="businessProfiler" class="spring.aop.exp.BusinessProfiler" />
        <bean id="myBusinessClass" class="spring.aop.exp.BusinessImpl" />
</beans>

在运行主程序时,我得到了输出(它没有从 Aspect 类 - BusinessProfiler 调用 profile1)。但是,如果我直接从主类调用 doOps1,则会调用方面方法。我想知道如果仅从主方法调用方面是否应该工作,而不是其他方法。

2012 年 10 月 26 日上午 11:56:19 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息:刷新 org.springframework.context.support.ClassPathXmlApplicationContext@be2358:显示名称 [org.springframework.context.support.ClassPathXmlApplicationContext@be2358] ; 启动日期 [2012 年 10 月 26 日星期五 11:56:19 EDT];上下文层次结构的根 2012 年 10 月 26 日上午 11:56:19 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO:从类路径资源 [ExpAOP.xml] 加载 XML bean 定义 2012 年 10 月 26 日 11:56:19 AM org.springframework.context.support.AbstractApplicationContext 获得FreshBeanFactory 信息:应用程序上下文的 Bean 工厂 [org.springframework.context.support.ClassPathXmlApplicationContext@be2358]:org.springframework.beans.factory.support。DefaultListableBeanFactory@1006d75 Oct 26, 2012 11:56:19 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息:在 org.springframework.beans.factory.support.DefaultListableBeanFactory@1006d75 中预实例化单例:定义 bean [org .springframework.aop.config.internalAutoProxyCreator,businessProfiler,myBusinessClass]; 工厂层次结构的根

*我在 doSomeOperation 内 完成了睡眠。 在 Ops1 内***

4

1 回答 1

0

Spring AOP默认情况下proxy-based,当您从该类的另一个方法中调用同一类的方法时,您的调用不会通过方面代理,而是直接到该方法 - 这就是不调用方面代码的原因。要更好地理解它,请阅读Spring 文档中有关了解 AOP 代理的这一章

于 2012-10-28T14:52:18.470 回答