有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

@Aspect的java Spring自动连线bean为空

我有以下spring配置:

<context:component-scan base-package="uk.co.mysite.googlecontactsync.aop"/>

<bean name="simpleEmailSender" class="uk.co.mysite.util.email.simple.SimpleEmailSenderImplementation"/>

<aop:aspectj-autoproxy/>

然后我有一个方面:

@Aspect
public class SyncLoggingAspect {
    @Autowired
    private SimpleEmailSender simpleEmailSender

    @AfterReturning(value="execution(* uk.co.mysite.datasync.polling.Poller+.doPoll())", returning="pusher")
    public void afterPoll(Pusher pusher) {      
        simpleEmailSender.send(new PusherEmail(pusher));
    }
}

这个特性可以工作(我可以在afterPoll上点击一个断点),但simpleEmailSender为空。不幸的是,我找不到关于为什么会这样的明确文件。(请注意,我的simpleEmailSender bean是存在的,并且正确地连接到了其他类中)以下事情让我困惑:

  1. 上下文:组件扫描是否应该拾取@Aspect?如果是的话,那么它肯定是一个spring管理的bean,因此autowired应该可以工作吗
  2. 如果context:component scan不用于创建方面,那么如何创建我的方面?我以为aop:aspectj autoproxy只是创建了一个beanPostProcessor来代理我的@Aspect类?如果不是spring管理的bean,它将如何做到这一点

很明显,你可以看出,我不知道事情应该如何从头开始


共 (2) 个答案

  1. # 1 楼答案

    aspect是一个单例对象,在Spring容器外部创建。XML配置的解决方案是使用Spring的工厂方法来检索方面

    <bean id="syncLoggingAspect" class="uk.co.demo.SyncLoggingAspect" 
         factory-method="aspectOf" />
    

    通过这种配置,aspect将被视为任何其他Springbean,自动布线将正常工作

    您还必须对枚举对象和其他没有构造函数的对象或在Spring容器外部创建的对象使用factory方法

  2. # 2 楼答案

    另一种选择是将@Configurable添加到aspect类中,而不是与XML混为一谈