dependency-injection - 如何让@Autowired 在普通类里面工作?

标签 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 属性 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/

相关文章:

java - 我们如何在 spring 中使用依赖注入(inject)动态加载特定类?

java - NoSuchMethodError : com. amazonaws.services.s3.model.S3ObjectInputStream.readAllBytes()

android - 如何延迟为 kotlin 中的 val 赋值?

kotlin - 无法从构造函数的子类型调用函数

c# - Autofac:注册组件并根据解析父解析

java - Dagger 2 场注入(inject)在 Android 中不起作用

java - 使用 final 字段防止 "this"在构造过程中转义

java - Spring Boot事务管理器建议回滚所有异常

java - Spring Boot 2.2 activemq jetty冲突

java - 如何优雅地支持firebase数据库上的数据类型更改?