温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - How to use Spring Autowired (or manually wired) in Scala object?
autowired lift scala spring

其他 - 如何在Scala对象中使用Spring自动接线(或手动接线)?

发布于 2020-06-10 10:11:39

我正在尝试将Spring与Scala结合使用。我知道Autowired可以与Scala类一起使用,但是我正在使用一个需要对象的Web框架,并且我想向其中注入dao。我不知道该怎么做?抱歉,我对Scala还是陌生的,在此先感谢。

    @Service
    object UserRest extends RestHelper {
        @Autowired
        @BeanProperty
        val userRepository: UserRepository = null;

        .....
    }

    <beans>
         .....
         <bean id="userRest" class="com.abc.rest.UserRest" >
              <!--- this is my attempt to manually wire it --->
              <property name="userRepository" ref="userRepository"/>
         </bean>
    </beans>

查看更多

提问者
bernardw
被浏览
7
2017-05-23 19:45

基本上,您有两个问题:

  • 财产应该是可变的,即var而不是val

  • Scala的所有方法object都是static,而Spring需要实例方法。实际上,Scala创建了一个带有UserRest$在幕后命名的实例方法的类,并且您需要使其UserRest$.MODULE$Spring的单例实例可用。
    Spring可以将配置应用于预先存在的单例实例,但是它们应该由方法返回,而是UserRest$.MODULE$一个字段。因此,您需要创建一个返回它的方法。

因此,这样的事情应该起作用:

object UserRest extends RestHelper {
   @BeanProperty
   var userRepository: UserRepository = null;

   def getInstance() = this
   ...
}

<bean id="userRest" 
    class="com.abc.rest.UserRest" 
    factory-method = "getInstance">
    <property name="userRepository" ref="userRepository"/>
</bean>

您可以将替换<property>@Autowired,但@Service由于上述单例实例存在问题,因此不能替换手动的Bean声明

也可以看看: