@Autowired 在Service中的依赖注入

@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
<bean id="employeeService" class="com.example.PrimaryEmployeeServiceImpl" primary="true"/>
  • 使用 @Autowired 和集合:

    • 如果你希望注入所有实现类的集合,可以将实现类的集合注入到一个集合类型的字段中。例如:

      @Autowired
      private List<EmployeeService> employeeServices;
      
    • 这样,Spring容器会将所有 EmployeeService 接口的实现类注入到 employeeServices 集合中。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值