如何使@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
作为它被调用的类的依赖,它的工作。