@EnableAspectJAutoProxy不能与proxyTargetClass = false一起使用

时间:2014-02-02 19:03:35

标签: spring-aop spring-annotations

我第一次学习Spring AOP。

我正在阅读这些网站: Site2Site1

在此之后,我已经完成了下一个课程

主要课程:

public class App {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(AppConfig.class);
        context.refresh();

        MessagePrinter printer = context.getBean(MessagePrinter.class);

        System.out.println(printer.getMessage());
    }
}

App config class:

@Configuration
@ComponentScan("com.pjcom.springaop")
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class AppConfig {

    @PostConstruct
    public void doAlert() {

        System.out.println("Application done.");
    }

}

Aspect类:

@Component
@Aspect
public class AspectMonitor {

    @Before("execution(* com.pjcom.springaop.message.impl.MessagePrinter.getMessage(..))")
    public void beforeMessagePointCut(JoinPoint joinPoint) {

        System.out.println("Monitorizando Mensaje.");
    }

}

还有其他人......

就像那个app工作不错,但是如果我将proxyTargetClass设置为false。然后我得到下面的错误。

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pjcom.springaop.message.impl.MessagePrinter] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:318)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:985)
    at com.pjcom.springaop.App.main(App.java:18)

为什么?

2 个答案:

答案 0 :(得分:2)

@EnableAspectJAutoProxy(proxyTargetClass=false)

表示将创建JDK动态代理以支持对象的方面执行。因此,由于此类代理需要一个类来实现接口,因此MessagePrinter必须实现一些声明方法getMessage的接口。

@EnableAspectJAutoProxy(proxyTargetClass=true)

在相反的指示下使用CGLIB代理,它能够为没有接口的类创建代理。

答案 1 :(得分:0)

1>消息打印机必须定义为一个组件,即: `

 package com.pjcom.springaop.message.impl;
    @Component
    public class MessagePrinter{
    public void getMessage(){
    System.out.println("getMessage() called");
    }
    }`

与配置java文件在同一个包中,如果没有为其他包定义@ComponentScan。

2 - ;如果相同类型的bean类有许多其他依赖项,那么在Spring Config中解析依赖关系时使用@Qualifier注释。