Web后端开发中对三层架构解耦之控制反转与依赖注入

简介: Web后端开发中对三层架构解耦之控制反转与依赖注入

内聚与耦合

内聚 比如说我们刚刚书写的员工的实现类

在这里我们仅仅书写的是和员工相关的代码

而与员工无关的代码都没有放到这里

说明内聚程度较高

耦合

以后软件开发要高内聚 低耦合

提高程序灵活性 扩拓展性

分析代码

如何解耦

创建容器

提供一个容器 存储东西 存储EmpService类的实现

EmpController直接去容器中去找 又没有这个对象 复制给empService

有没有这个对象

控制反转与依赖注入

Springboot中很重要的概念

意思是如何操作运用容器

控制反转

是对象的创建控制权由应用程序转移到了外部容器 这个容器叫spring容器 ioc容器

依赖注入

是容器为应用程序提供运行时依赖的资源

Bean对象

表示IOC容器中创建管理的对象

IOC与DI的入门

控制反转和依赖注入的代码实现

我们需要完成controller层与service层的解耦

还有service层与dao层的解耦

具体代码程序

service层和dao层解耦 controller层和service层解耦

将两层中的对象删掉

程序会爆空指针异常

我们此时就需要用IOC和DI完成解耦操作

第一步 控制反转

第二步 需要ioc容器为其提供bean对象

启动springboot

部署后就可以访问服务端

如果以后我们在业务操作中要改变实现类

直接将需要交给控制层的核心逻辑层加上Component注释就行

再取消之前的实现类的注释

代表将当前实现类交给Bean容器管理

小结

控制反转:Component注解

将当前类交给IOC容器管理 成为IOC容器里的bean

依赖注入:Autowired注解

运行时,IOC容器会提供该类型的bean对象,并复制给该对象

代码实现

(只写了实现类)

package com.bigdate.threetier_architecture.dao.impl;
 
import com.bigdate.threetier_architecture.dao.EmpDao;
import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.util.XmlParserUtils;
import org.springframework.stereotype.Component;
 
import java.util.List;
 
//交给ioc容器处理 控制反转 称为ioc容器中的bean
@Component
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
        List<Emp>empList= XmlParserUtils.parse(file,Emp.class);
        return empList;
    }
}
package com.bigdate.threetier_architecture.service.impl;
 
import com.bigdate.threetier_architecture.dao.EmpDao;
import com.bigdate.threetier_architecture.dao.impl.EmpDaoA;
import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.List;
 
//交给ioc容器处理 控制反转 称为ioc容器中的bean
@Component
public class EmpServiceA implements EmpService {
 
    @Autowired//程序在运行时 ioc会提供该类型的bean对象 并赋值给该对象 依赖注入
    private EmpDao empDao;
    @Override
    public List<Emp> listEmp() {
        List<Emp> empList=empDao.listEmp();
        empList.stream().forEach(emp -> {
 
            //处理gender
            String gender=emp.getGender();
            if(gender.equals("1")){
                emp.setGender("男");
            }else emp.setGender("女");
 
            //处理job
            String job=emp.getJob();
            if(job.equals("1")){
                emp.setJob("学生");
            }else emp.setJob("老师");
 
 
 
        });
        return empList;
    }
}
package com.bigdate.threetier_architecture.controller;
 
import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.pojo.Result;
import com.bigdate.threetier_architecture.service.EmpService;
import com.bigdate.threetier_architecture.service.impl.EmpServiceA;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.List;
 
@RestController
public class Controller {
    @Autowired//程序在运行时 ioc会提供该类型的bean对象 并赋值给该对象 依赖注入
    private EmpService empService;
 
    @RequestMapping("/listEmp")
    public Result list(){
 
        //调用service响应数据 再响应数据
        List<Emp> empList=empService.listEmp();
 
        //响应数据
        return Result.success(empList);
 
    }
}

IOC详解

概念

控制反转

将对象的容器交给IOC容器 由IOC容器创建管理这些对象

而IOC容器里这些对象又是bean对象

Component注解可以适用于一些工具类

实操

我们之前开发的后端架构其实就已经交给IOC容器管理

注解RestController

启动Springboot

Component的衍生注解 底层都封装了原注解和Component

bean容器默认是类名小写

Bean的声明

Bean的组件扫描

把数据层移出去 运行就会报错 因为找不到bean了

这里有个隐式注解

启动类当前包以及子包 搭建架构的常见错误

我们要加注解

这种解决方案不规范

我们在实际开发中应该按照springboot的规范来书写代码

启动类是放在总工程包下

而于启动类同级的是不同业务层的包 里面有接口和实现类

小结

DI详解

依赖注入

IOC容器要为运行程序提供需要的资源 资源即对象

自动装配

会去IOC容器中自动找这种类型的对象

然后赋值给对象

如果说往IOC容器里放入了两个同类型的对象

依赖注入时就会报错

解决

Primary注解

设置优先级

Autowired+Qualifier注解

指定bean的名字

如果说声明bean的时候默认没有设置

那就是类名小写

Resource注解

Autowired是按照类型注入的

而Resource是按照名称注入的

小结

面试题

@Resource@Autowired 是 Java 中用于依赖注入的注解,它们的主要区别如下:

  1. 来源:
  • @Resource 是 Java EE 提供的注解,在 javax.annotation 包中。
  • @Autowired 是 Spring Framework 提供的注解,在 org.springframework.beans.factory.annotation 包中。
  1. 用途:
  • @Resource 旨在通过名称进行依赖注入。它默认按照名称进行匹配,如果指定了 name 属性,则按照指定名称进行匹配。
  • @Autowired 旨在通过类型进行依赖注入。它默认按照类型进行匹配,如果多个匹配项,则会尝试按照名称进行匹配。
  1. 配置:
  • @Resource 可以通过 name 属性指定要注入的 Bean 的名称,也可以直接应用在字段、setter 方法或构造方法上。
  • @Autowired 可以应用在字段、构造方法、setter 方法上,通过类型匹配自动注入 Bean。
  1. 依赖性:
  • @Resource 是 Java EE 的标准注解,不依赖于 Spring,可以在非 Spring 容器中使用。
  • @Autowired 是 Spring 特有的注解,依赖于 Spring 框架,需要在 Spring 容器中才能生效。

总体而言,如果你想按照名称进行注入,可以使用 @Resource;如果你想按照类型进行注入,并且在 Spring 环境中使用,通常会选择 @Autowired

目录
打赏
0
0
0
0
38
分享
相关文章
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
118 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
117 6
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
59 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
布谷直播系统源码开发实战:从架构设计到性能优化
作为山东布谷科技的一名技术研发人员,我参与了多个直播系统平台从0到1的开发和搭建,也见证了直播行业从萌芽到爆发的全过程。今天,我想从研发角度,分享一些直播系统软件开发的经验和心得,希望能对大家有所帮助。
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
102 2
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
122 7
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
249 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等