使用Spring @Autowired和Scala Trait

时间:2012-05-29 00:27:36

标签: spring scala dependency-injection

我有一个简单的场景,我按如下方式扩展Scala特征:

    trait Vehicle {

      @Autowired
      private var myDistanceLogger: MyDistanceLogger = null

      def travel(miles:Int) = {
        println("travelling " + miles)
        myDistanceLogger.logMiles(miles)
      }
    }

    @Component
    class Truck extends Vehicle {

    }

即使Truck包在Springs组件扫描中,我也得到一个nullpointer异常。包中的所有其他(非扩展)类都很好。关于什么是错的任何想法?

3 个答案:

答案 0 :(得分:2)

这是一个小小的猜测 - 基于this文章,scala中的特征被转换为java接口。 所以,你的特点:

trait Vehicle {
      @Autowired
      private var myDistanceLogger: MyDistanceLogger = null
}

会被翻译成:

public interface Vehicle {
    public MyDistanceLogger myDistanceLogger();
}

@Autowired在getter中没有意义,我猜这就是为什么这不会被自动装配的原因。

答案 1 :(得分:0)

我刚刚对此进行了测试,它确实有效 - 特性中的私有变量可以正确自动装配。

你什么时候打电话旅行()?也就是说,在所有Spring初始化完成后,你是否确实在调用它?

答案 2 :(得分:0)

Scala将注释放在字段上,Spring将找不到它。您需要确保它放在Scala的内部setter方法上:

import scala.annotation.meta.setter

@(Autowired @setter)
private var myDistanceLogger: MyDistanceLogger = _