分层解耦-05.IOC&DI-DI详解

一.依赖注入的注解

在我们的项目中,EmpService的实现类有两个,分别是EmpServiceA和EmpServiceB。这两个实现类都加上@Service注解。我们运行程序,就会报错。

这是因为我们依赖注入的注解@Autowired默认是按照类型来寻找bean对象的进行依赖注入的,controller程序会在IOC容器中寻找到两个service的bean对象,此时他会不知道使用哪一个,就会上面的报错。 

@Autowired      // DI:依赖注入,service依赖于dao,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    private EmpService empService;

为了解决这个问题,要么就将其中的一个@Service注解去掉,或者采用方法二,使用依赖注入的注解来指定注解的优先级。

二.@Primary注解

@Primary注解作用在bean对象上,当IOC容器中有多个不同实现类的bean对象时,哪个实现类上面加上了@Primary注解,哪个实现类的bean对象就会起作用。

package com.gjw.service.impl;

import com.gjw.dao.EmpDao;
import com.gjw.pojo.Emp;
import com.gjw.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

import java.util.List;

//@Component  // IOC:控制反转,将实现类对象交给容器。将当前类交给IOC容器管理,成为IOC容器中的bean
@Primary
@Service
public class EmpServiceA implements EmpService {
    @Autowired  // DI:依赖注入,service依赖于dao,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    private EmpDao empDao;
    @Override
    public List<Emp> listEmp() {
        List<Emp> empList = empDao.listEmp();
        empList.stream().forEach(emp ->
        {
            if ("1".equals(emp.getGender())) {
                emp.setGender("男");
            } else if ("2".equals(emp.getGender())) {
                emp.setGender("女");
            }
            if ("1".equals(emp.getJob())) {
                emp.setJob("讲师");
            } else if ("2".equals(emp.getJob())) {
                emp.setJob("班主任");
            } else if ("3".equals(emp.getJob())) {
                emp.setJob("就业指导");
            }
        });
        return empList;
    }
}

 

三.@Qualifier注解

@Qualifier注解主要是配合着@Autowired注解使用,在要注入的类(此处是controller)的@Autowired注解下面加上@Qualifier(bean对象名字)

(bean对象名字)默认是实现类类名首字母小写

package com.gjw.controller;
/*
    对xml文件进行处理,从而加载处理要响应的数据
 */
import com.gjw.pojo.Emp;
import com.gjw.pojo.Result;
import com.gjw.service.EmpService;
import com.gjw.service.impl.EmpServiceA;
import com.gjw.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;


@RestController
public class EmpController {
    @Autowired      // DI:依赖注入,service依赖于dao,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    @Qualifier("empServiceB")
    private EmpService empService;
    @RequestMapping("/listEmp")
    public Result list(){

        List<Emp> empList = empService.listEmp();
        return Result.success(empList);
    }
/*
    @RequestMapping("/listEmp")
    public Result list(){
        // 1.加载emp.xml,并解析emp.xml中的数据
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

        // 2.对员工信息中的gender,job字段进行处理
        empList.stream().forEach(emp ->
                {
                    if ("1".equals(emp.getGender())) {
                        emp.setGender("男");
                    } else if ("2".equals(emp.getGender())) {
                        emp.setGender("女");
                    }
                    if ("1".equals(emp.getJob())) {
                        emp.setJob("讲师");
                    } else if ("2".equals(emp.getJob())) {
                        emp.setJob("班主任");
                    } else if ("3".equals(emp.getJob())) {
                        emp.setJob("就业指导");
                    }
                });
        // 3.组装数据并返回
        return Result.success(empList);
    }
*/
}

指定empServiceB这个bean对象生效。 

四.@Resouce注解 

使用@Resouce注解,@Autowired注解默认是按照bean对象的类型进行选择的。@Resouce注解是按照名称进行bean对象的选择的。@Resouce(bean对象名字)

package com.gjw.controller;
/*
    对xml文件进行处理,从而加载处理要响应的数据
 */
import com.gjw.pojo.Emp;
import com.gjw.pojo.Result;
import com.gjw.service.EmpService;
import com.gjw.service.impl.EmpServiceA;
import com.gjw.utils.XmlParserUtils;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;


@RestController
public class EmpController {
    /*@Autowired      // DI:依赖注入,service依赖于dao,运行时IOC容器会提供该类型的bean对象,并赋值给该变量
    @Qualifier("empServiceB")*/
    @Resource(name = "empServiceB")
    private EmpService empService;
    @RequestMapping("/listEmp")
    public Result list(){

        List<Emp> empList = empService.listEmp();
        return Result.success(empList);
    }
/*
    @RequestMapping("/listEmp")
    public Result list(){
        // 1.加载emp.xml,并解析emp.xml中的数据
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

        // 2.对员工信息中的gender,job字段进行处理
        empList.stream().forEach(emp ->
                {
                    if ("1".equals(emp.getGender())) {
                        emp.setGender("男");
                    } else if ("2".equals(emp.getGender())) {
                        emp.setGender("女");
                    }
                    if ("1".equals(emp.getJob())) {
                        emp.setJob("讲师");
                    } else if ("2".equals(emp.getJob())) {
                        emp.setJob("班主任");
                    } else if ("3".equals(emp.getJob())) {
                        emp.setJob("就业指导");
                    }
                });
        // 3.组装数据并返回
        return Result.success(empList);
    }
*/
}

注意:当我们使用Resouce注解时,是JDK框架提供Resouce注解。而使用Autowired时使用的是springboot框架提供Autowired注解。

 五.总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值