@Autowired
在Service中的依赖注入
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/**
* 员工登录
* @param request
* @param employee
* @return
*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
/**
* 1、将页面提交的密码password进行md5加密处理
* 2、根据页面提交的用户名username查询数据库
* 3、如果没有查询到则返回登录失败结果
* 4、密码比对,如果不一致则返回登录失败结果
* 5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
* 6、登录成功,将员工id存入session并返回登陆成功结果
*/
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername, employee.getUsername());
Employee emp = employeeService.getOne(queryWrapper); //username有唯一约束
if(emp == null){
return R.error("用户不存在");
}
if(!emp.getPassword().equals(password)){
return R.error("密码错误");
}
if(emp.getStatus() == 0){
return R.error("账号已禁用");
}
request.getSession().setAttribute("employee", emp.getId());
return R.success(emp);
}
} 中@Autowired
private EmployeeService employeeService;
在这一段代码中,
@Autowired
private EmployeeService employeeService;
这两行代码的功能和过程不太明白。这里,记录我的学习。
用 @Autowired
注解可以进行依赖注入。Spring容器会负责在运行时为被 @Autowired
注解标记的字段或方法参数提供相应的实例。
在代码中,EmployeeService
是一个接口,而不是具体的类。Spring框架具有默认的实现查找机制,当发现某个接口有唯一的实现类时,它会自动为这个接口创建一个实例并注入到对应的字段中。
过程是:
-
EmployeeService 的实现类:
- 在项目中,存在一个类实现了
EmployeeService
接口。Spring容器会在启动时扫描项目中的Bean,并选择合适的实现类。
- 在项目中,存在一个类实现了
-
通过 @Service 注解标记:
- 如果在实现类上使用了
@Service
注解(例如EmployeeServiceImpl
类上使用了@Service
注解),Spring容器会识别这个类作为服务层组件,并将其纳入Bean的管理范围。
- 如果在实现类上使用了
-
依赖注入:
- 在
EmployeeController
控制器中,使用@Autowired
注解标记了private EmployeeService employeeService;
字段。当Spring容器初始化EmployeeController
实例时,会自动查找EmployeeService
接口的实现类,并将其注入到employeeService
字段中。
- 在
-
运行时实例化:
- 在代码运行时,
employeeService
字段将引用EmployeeServiceImpl
(或其他实现类)的一个实例。这样,你就可以在控制器中调用服务层的方法了。
- 在代码运行时,
Spring的依赖注入机制使得你可以声明接口类型的字段,并让Spring容器负责在运行时实例化并注入相应的实现类。这样的设计有助于降低组件之间的耦合度,提高代码的灵活性和可维护性。
如果一个接口有多个实现类,Spring容器在注入时需要决定使用哪一个实现类。有几种方式可以帮助Spring容器作出正确的选择:
-
使用
@Qualifier
注解:-
如果你在某个地方使用了
@Autowired
注解,而且有多个实现类,可以结合@Qualifier
注解指定具体要注入的实现类的bean名称。例如:@Autowired @Qualifier("specificImplementation") private EmployeeService employeeService;
-
上述代码中,
specificImplementation
是要注入的实现类的bean名称。
-
-
使用
@Primary
注解:-
你可以在一个实现类上使用
@Primary
注解,表示这个实现类是首选的。当有多个实现类时,Spring容器会选择具有@Primary
注解的实现类进行注入。@Service @Primary public class PrimaryEmployeeServiceImpl implements EmployeeService { // 实现类的代码 }
-
-
通过配置文件指定:
- 你可以通过Spring的配置文件(例如XML配置文件)指定要注入的bean名称或使用
@Primary
。
- 你可以通过Spring的配置文件(例如XML配置文件)指定要注入的bean名称或使用
<bean id="employeeService" class="com.example.PrimaryEmployeeServiceImpl" primary="true"/>
-
使用
@Autowired
和集合:-
如果你希望注入所有实现类的集合,可以将实现类的集合注入到一个集合类型的字段中。例如:
@Autowired private List<EmployeeService> employeeServices;
-
这样,Spring容器会将所有
EmployeeService
接口的实现类注入到employeeServices
集合中。
-