面试题答案
一键面试常用依赖注入方式
- 构造函数注入:通过类的构造函数传递依赖。这种方式使得依赖关系在对象创建时就明确,并且保证了对象在创建后就处于可用状态,同时也利于单元测试。
- 字段注入:通过在类的属性上直接使用依赖注入注解来注入依赖。这种方式简单直观,但可能导致类与依赖的耦合度较高,并且不利于单元测试。
- Setter方法注入:通过类的Setter方法传递依赖。这种方式允许在对象创建后动态地设置依赖,灵活性较高,但可能导致对象在部分状态下依赖未设置的情况。
构造函数注入示例
假设我们有一个UserService
接口及其实现类UserServiceImpl
,还有一个UserController
需要依赖UserService
。
// UserService接口
interface UserService {
fun getUserName(): String
}
// UserServiceImpl实现类
class UserServiceImpl : UserService {
override fun getUserName(): String {
return "John Doe"
}
}
// UserController,使用构造函数注入UserService
class UserController(private val userService: UserService) {
fun getUser(): String {
return userService.getUserName()
}
}
在Spring Boot中,通常会通过@Component
等注解将UserServiceImpl
声明为一个Spring组件,然后Spring会自动将其注入到UserController
的构造函数中。
字段注入示例
// UserService接口
interface UserService {
fun getUserName(): String
}
// UserServiceImpl实现类
class UserServiceImpl : UserService {
override fun getUserName(): String {
return "Jane Smith"
}
}
// UserController,使用字段注入UserService
class UserController {
@Autowired
lateinit var userService: UserService
fun getUser(): String {
return userService.getUserName()
}
}
这里使用@Autowired
注解(在Kotlin中需要导入相关包)对userService
字段进行注入。不过需要注意lateinit
关键字的使用,因为字段在注入前可能未初始化。在Spring Boot应用中,同样需将UserServiceImpl
声明为Spring组件以便注入。