如何使@Autowired在普通班的工作?

这是我得到的:

@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能够工作,但也许我错了?

仅仅给这个类添加@Component是不够的。

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

如果您使用的是Spring引导 – 您不需要自己声明@ComponentScan ,因为@SpringBootApplication继承它,并且默认情况下它将扫描当前包中的所有类以及它的所有子包。

2)你必须从春天的上下文中获取bean。 用new创建一个对象将不起作用。

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

  • 如果你有访问ApplicationContext对象,那么你可以做这样的事情:

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

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

所以我对Spring很FooController ,试图通过new而不是@Autowire创建一个实例来调用FooController 。 当我添加FooController作为它被调用的类的依赖,它的工作。