说明
@Autowired
注解,用于自动将一个对象注入到当前的对象中。
spring 推荐使用构造器
注入的方式。
spring 不推荐@Autowired
注解用于字段
。
构造器注入
依赖注入,通过@Autowired注解,用在构造方法上。
如果只有一个
构造方法,则@Autowired注解可以省略
。
示例
代码
java
package com.example.web.controller;
import com.example.web.entity.User;
import com.example.web.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public List<User> selectAll() {
return userService.list();
}
}
经过测试,如上的代码中,userMapper 对象,可以被正确注入到Controller对象中。
单元测试,必须添加@Autowired注解
在单元测试时,通过构造器依赖注入,未添加@Autowired
注解,运行单元测试方法时会报错。
单元测试时,构造器上必须添加@Autowired
注解。
报错信息
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [com.example.web.service.UserService userService] in constructor [com.example.ServiceTest(com.example.web.service.UserService)].
正确代码(添加了@Autowired)
java
package com.example;
import com.example.web.entity.User;
import com.example.web.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class ServiceTest {
private final UserService userService;
@Autowired
ServiceTest(UserService userService) {
this.userService = userService;
}
@Test
void list() {
List<User> list = userService.list();
System.out.println(list);
}
}