这是我得到的:
@Component
class FooController {
fun createFoo() {
val foo = FooEntity()
foo.name = "Diogo"
fooRepository.save(foo)
}
@Autowired
internal lateinit var fooRepository: FooRepository
}
当尝试调用 createFoo()
时,我收到以下错误:
kotlin.UninitializedPropertyAccessException:lateinit 属性 fooRepository 尚未初始化
我认为在顶部添加 @Component
会使 Spring 发现我的类,从而使 @Autowired
工作,但也许我弄错了?
最佳答案
只需添加 @Component
上课是不够的。
1) 当您使用 @Component
时您必须确保该类被组件扫描所扫描。这取决于您如何引导您的应用程序,但您可以使用 <context:component-scan base-package="com.myCompany.myProject" />
用于 XML 配置或 @ComponentScan
用于java配置。
如果你使用的是 Spring boot - 你不需要声明 @ComponentScan
你自己,因为@SpringBootApplication
继承它,默认情况下它会扫描当前包中的所有类及其所有子包。
2) 你必须从 spring 上下文中获取 bean。使用 new
创建对象不会工作。
基本上有两种方法可以从应用程序上下文中获取 bean:
- 如果您可以访问 ApplicationContext 对象,那么您可以执行以下操作:
ApplicationContext ctx = ...;
MyBean mb = ctx.getBean(MyBean.class);//getting by type
- 在上下文中声明的任何 spring bean 都可以使用依赖注入(inject) (
@Autowired
) 访问其他 bean
关于dependency-injection - 如何让@Autowired 在普通类里面工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273902/