Java 启用Spring AOP或AspectJ

Java 启用Spring AOP或AspectJ,java,spring,aop,spring-aop,Java,Spring,Aop,Spring Aop,以下是本问题的内容: 我最初的理解是,当使用SpringAOP时,用@Aspect注释的类被创建为Spring管理的bean,所以依赖注入将正常工作。然而,带有@Aspect注释的对象似乎是在spring容器外创建为单例的,因此我必须像这样用XML对其进行配置,以便将其作为spring托管bean启用: <bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" /> 这让我完全糊涂了。我认为以下

以下是本问题的内容:

我最初的理解是,当使用SpringAOP时,用@Aspect注释的类被创建为Spring管理的bean,所以依赖注入将正常工作。然而,带有@Aspect注释的对象似乎是在spring容器外创建为单例的,因此我必须像这样用XML对其进行配置,以便将其作为spring托管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
不是spring注释,组件扫描无法检测到它。因此,您必须以某种方式将其注册为Springbean。
解决方案的
方面起作用。你也可以试试

@Aspect
@Component

@组件将创建两个实例,一个在Spring容器内,一个在aspectJ容器内

使用@Configurable允许spring在aspectj容器实例化时管理类的依赖项注入等

@Aspect是SpringAOP支持的aspectj样式的注释,其中运行时编织用于处理拦截等

编译时编织允许您忽略使用,因为切入点将出现在字节码中,这是通过aspectj编译器完成的(请参阅mvn集成)

无论您使用aspectj编译器还是SpringAOP都没有区别,除非您使用factory/configurable,否则它不会以您想要的方式将方面创建为托管bean

严格来说,Aspectj配置是类中出现的切入点定义等

使用

  • @Aspect
  • @可配置


还要在XML配置文件中添加“

那么aspectJ配置和SpringAOP配置之间的区别是什么呢?这行得通吗?我发现,如果我这样做,spring会创建两个类实例,而作为方面使用的一个实例没有注入依赖项。我在spring 4.3中尝试了这一点,并用
@aspect
@Component
注释方面,即使在DI中也能很好地工作,正如@Bozho在回答中所写的那样