JavaWeb_Web后端_分层解耦

三层架构

  • controller: 控制层, 接收前端发送的请求, 对请求进行处理, 并响应数据.
  • service: 业务逻辑层, 处理具体的业务逻辑.
  • dao: 数据访问层(Data Access Object)(持久层), 负责数据访问操作, 包括数据的增, 删, 改, 查.

Dao

接口:

public interface EmpDao {
    // 获取员工列表数据
    public List<Emp> listEmp();
}

实现:

public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        // 1. 加载emp.xml并解析emp.xml中的数据
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
        return emplist;
    }
}

Service

接口:

public interface EmpService {
    // 获取员工列表数据
    public List<Emp> listEmp();
}

实现:

public class EmpServiceA implements EmpService {

    public EmpDao empDao = new EmpDaoA();

    @Override
    public List<Emp> listEmp() {
        // 1. 调用dao, 获取数据
        List<Emp> emplist = empDao.listEmp();
        // 2. 对员工信息中的gender, job字段进行处理
        emplist.stream().forEach(emp -> {
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            }else if("2".equals(gender)){
                emp.setGender("女");
            }
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            }else if("2".equals(job)){
                emp.setJob("班主任");
            }else if("3".equals(job)){
                emp.setJob("就业指导");
            }
        });
        return emplist;
    }
}

Controller

@RestController
public class EmpController {

    private EmpService empService = new EmpServiceA();

    @RequestMapping("/listEmp")
    public Result list()
    {
        // 1. 调用service, 获取数据
        List<Emp> emplist = empService.listEmp();

        // 2. 组装数据并返回
        return Result.success(emplist);
    }
}

分层解耦

概述

  • 内聚: 软件中各个功能模块内部的功能联系.
  • 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度.
  • 软件设计原则: 高内聚低合.

IOC&DI

  • 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
  • 依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为bean。

入门

  1. 控制反转: Service层 及 Dao层的实现类, 交给IOC容器管理.
@Component // 将当前类交给IOC容器管理, 成为IOC容器中的bean
public class EmpServiceA implements EmpService{}
@Component
public class EmpDaoA implements EmpDao {}
  1. 依赖注入: 为Controller及Service注入运行时依赖的对象.
@Autowired // 运行时, IOC容器会提供该类型的bean对象, 并赋值给该变量
private EmpService empService;
@Autowired
public EmpDao empDao;

IOC详解

Bean的声明

要把某个对象交给IOC容器管理, 需要在对应的类上加上如下注解之一.

注解说明位置
@Component声明bean的基础注解不属于以下三类时, 用此注解
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合, 用的少)
注意事项:
  1. 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
@Component("name")
  1. 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
Bean的组件扫描
  1. 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  2. @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
@ComponentScan({"com.itheima", "Test"}) // 配置扫描范围

DI详解

Bean注入
  1. @Autowired注解(Spring框架提供): 默认按照类型进行, 如果存在多个相同类型的bean, 将会报错.
  2. @Primary(Spring框架提供): 多个相同类型的bean中, 添加@Primary注解的bean生效.
  3. @Qualifier(Spring框架提供):
@Autowired
// 指定注入的bean
@Qualifier("empServiceA")
private EmpService empService;
  1. @Resource(JDK提供):
// 通过名称注入
@Resource(name = "empServiceA")
private EmpService empService;

来源

黑马程序员. JavaWeb开发教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y_cen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值