如何让@Autowired在普通班级工作?

时间:2016-09-01 14:13:21

标签: dependency-injection spring-boot kotlin

以下是我所拥有的:

@Component
class FooController {

    fun createFoo() {
        val foo = FooEntity()
        foo.name = "Diogo"

        fooRepository.save(foo)
    }

    @Autowired
    internal lateinit var fooRepository: FooRepository

}

尝试拨打createFoo()时,收到以下错误:

kotlin.UninitializedPropertyAccessException: lateinit property fooRepository has not been initialized

我认为在顶部添加@Component会使我的课程被Spring发现,从而使@Autowired工作,但也许我弄错了?

2 个答案:

答案 0 :(得分:6)

仅仅将@Component添加到课程中是不够的。

1)当您使用@Component时,您必须确保通过组件扫描扫描该类。这取决于您如何引导应用程序,但您可以使用<context:component-scan base-package="com.myCompany.myProject" />进行XML配置,或使用@ComponentScan进行Java配置。

如果您正在使用Spring启动 - 您不需要自己声明@ComponentScan,因为@SpringBootApplication会继承它,默认情况下会扫描当前包中的所有类,所有它的子包。

2)你必须从spring语境中获取bean。使用new创建对象将无效。

基本上有两种方法可以从应用程序上下文中获取bean:

  • 如果您可以访问ApplicationContext对象,那么您可以执行以下操作:

ApplicationContext ctx = ...; MyBean mb = ctx.getBean(MyBean.class);//getting by type

  • 在上下文中声明的任何spring bean都可以使用依赖注入(@Autowired
  • 访问其他bean

答案 1 :(得分:1)

因此,我对Spring非常陌生,并试图通过FooController而不是new在任何地方创建一个实例来致电@Autowire。当我添加FooController作为它被调用的类的依赖时,它起作用。