以下是我所拥有的:
@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
工作,但也许我弄错了?
答案 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 ctx = ...;
MyBean mb = ctx.getBean(MyBean.class);//getting by type
@Autowired
)答案 1 :(得分:1)
因此,我对Spring非常陌生,并试图通过FooController
而不是new
在任何地方创建一个实例来致电@Autowire
。当我添加FooController
作为它被调用的类的依赖时,它起作用。