面试题答案
一键面试构造函数注入
- 定义接口和实现类
interface MessageService { fun getMessage(): String } class DefaultMessageService : MessageService { override fun getMessage(): String = "Hello, World!" }
- 使用构造函数注入
import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component class MessagePrinter { private val messageService: MessageService @Autowired constructor(messageService: MessageService) { this.messageService = messageService } fun printMessage() { println(messageService.getMessage()) } }
在上述代码中,MessagePrinter
类通过构造函数接收 MessageService
的实例,Spring 会自动注入对应的实现类实例。
字段注入(不推荐,但也较为常见)
- 定义接口和实现类(同构造函数注入部分)
- 使用字段注入
import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component class MessagePrinter { @Autowired lateinit var messageService: MessageService fun printMessage() { println(messageService.getMessage()) } }
这里 MessagePrinter
类通过 @Autowired
注解直接在字段上进行依赖注入。不过这种方式会导致代码的可测试性变差,且违反了依赖注入的最佳实践,所以一般不推荐使用。
Setter 方法注入
- 定义接口和实现类(同构造函数注入部分)
- 使用 Setter 方法注入
import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component class MessagePrinter { private lateinit var messageService: MessageService @Autowired fun setMessageService(messageService: MessageService) { this.messageService = messageService } fun printMessage() { println(messageService.getMessage()) } }
MessagePrinter
类通过 setMessageService
方法接收 MessageService
的实例,Spring 会调用该方法进行依赖注入。