2012-03-12 34 views
6

这是从这个问题下面就:启用的Spring AOP还是AspectJ

Spring autowired bean for @Aspect aspect is null

我最初的理解是,在使用Spring AOP的时候,用@Aspect注解的类创建为春季管理的bean,所以依赖注入会正常工作。然而,它似乎与@Aspect注解的对象作为Spring容器外的单创建的,因此我不得不配置它在XML像这样以使其弹簧托管bean:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" /> 

这现在已经完全困惑了我。我想下面的配置将使用Spring AOP的:

<context:component-scan base-package="com.mysite.aspectPackage"/> 
<aop:aspectj-autoproxy/> 

因此,这将使用组件扫描创建方面豆类扫描@Aspect注解,然后自动代理将创建了BeanPostProcessor其代理我的上下文中的所有豆类与适当的咨询。然后我想启用aspectJ我需要一个完全不同的XML配置(顺便说一句,我似乎无法在文档中找到示例)。这种配置使用aspectJ来创建将在我的容器之外或者通过操作字节码而不是代理来工作的方面。


这不是Spring AOP和方面Ĵ之间的差异问题,这是很好这里阐述:

Spring AOP vs AspectJ

回答

5

@Component将创建2个实例,一个在Spring容器中,一个在aspectJ容器中。

使用@Configurable允许Spring在由aspectj容器实例化时为您的类管理依赖注入等。

@Aspect是由弹簧AOP,在运行时编织是用来处理支持一个AspectJ风格的注解拦截等

编译时编织让你忽略使用为切入点将出现在字节码,这是通过aspectj编译器完成的(关于mvn集成,请参阅http://mojo.codehaus.org/aspectj-maven-plugin/)。

无论你使用aspectj编译器还是spring-aop没有区别,它都不会以你想要的方式创建你的方面作为托管bean,除非你使用工厂/可配置。

Aspectj配置严格来说是切入点定义等,它们将存在于你的类中。

+0

我在spring 4.3中试过这个,并且用@ @Aspect' @ Component'注解方面,即使使用DI,它也可以很好地工作,就像@Bozho在他的回答中所写的一样 – csharpfolk 2016-11-27 17:45:53

8

@Aspect不是春注释,这是不通过组件扫描检测。所以你必须以某种方式将它注册为一个spring bean。 aspectOf解决方案有效。你也可以尝试

@Aspect 
@Component 
+0

那么aspectJ配置和弹簧AOP配置有什么区别? – mogronalol 2012-03-12 14:12:38

+1

做这项工作?我发现如果我这样做,这个春天会创建该类的两个实例,并且用作该方面的那个实例不会注入其依赖项。 – 2012-04-17 08:57:45

-1

使用

  • @Aspect
  • @Configurable

同时添加 “<方面:弹簧配置/>” 在您的XML配置文件。