Aspectj建议未被执行

时间:2015-07-18 09:01:03

标签: spring-mvc aspectj

我正在尝试编写一个简单的AspectJ实现,但建议没有被执行。

LoggingAspect类正在启动,就像在控制台中我可以看到s.o.p的构造函数

This is logging aspect 

在加载ApplicationContext并初始化controllerAspect时打印。当我运行main方法时,输出是

Name: John Age :12

我期待的是@Before建议的s.o.p应首先打印,然后打印getter方法@AfterReturning s.o.p应打印。

没有编译错误,程序正在运行,但建议没有执行。

根据切入点,建议应该在Customer类的所有方法上实现。

我经历了这里发布的一些类似问题,但无法弄清楚我的实施问题是什么。

任何人都可以解决我所犯的错误并提供解决方案吗?

这是片段servlet-context.xml

<context:component-scan base-package="main.com.controller"/>                
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven></annotation-driven>      

<aop:aspectj-autoproxy/>
<!-- AOP support -->      

<bean id='controllerAspect' class='main.com.logging.LoggingAspect' />
<beans:bean id="cust" class="main.com.dtos.Customer"</beans:bean> 

<resources mapping="/resources/**" location="/resources/" />

<beans:bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">       
<beans:property name="prefix" value="/WEB-INF/views/"/>
<beans:property name="suffix" value=".jsp"/>
</beans:bean>

LoggingAspect类是:

@Aspect
public class LoggingAspect {
    public LoggingAspect() {
        System.out.println("This is logging aspect");
    }

    @Pointcut("execution(* com.dtos.*.*(..))")
    public void getMethodPointcut() {}

    @AfterReturning(pointcut = "getMethodPointcut()", returning="retVal")
    public void afterReturningAdvice(Object retVal) {
        System.out.println("Returning:" + retVal.toString() );
    }

    @Before("getMethodPointcut()")
    public void printBefore(JoinPoint jp ) {
        System.out.println("Before calling method:"+jp.getSignature());
}

客户类是:

@Size(max=30, min=3)
@NotNull
private String name;

@Max(150)
@NotNull
private String age; 

public Customer() {}

public Customer(String sName, String sAge) {
    name = sName;
    age = sAge;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}

@Override
public String toString() {
    return "Customer [name=" + name + ", age=" + age + "]";
}

主要方法是:

public static void main(String[] args) {
    ApplicationContext context = 
        new ClassPathXmlApplicationContext("classpath:servlet- context.xml");

    Customer cust = (Customer)context.getBean("cust");
    cust.setAge("12");
    cust.setName("John");

    String name = cust.getName();
    String age = cust.getAge();

    System.out.println("Name: "+name+" Age :"+age);
}

Aspectj POM依赖项

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.7.4</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>1.7.4</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.4</version>
</dependency>

1 个答案:

答案 0 :(得分:0)

为了让你能够通过接受答案来结束这个问题,我会在评论中重复我的回答:

你的Spring配置意味着它是data = { 'title': [{content: 'Value'}], 'content': [{content: 'Value'},{content: 'Value'}] } ,你的方面切入点正在寻找main.com.dtos.Customer(没有com.dtos.*前缀)。