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

目录
相关文章
|
1天前
|
缓存 前端开发 JavaScript
现代Web开发中的前端性能优化策略
在当今快节奏的Web开发环境中,前端性能优化至关重要。本文探讨了一些实用的策略和技术,帮助开发人员提升网页加载速度和用户体验。
|
1天前
|
敏捷开发 消息中间件 监控
探索后端开发中的微服务架构
本文深入探讨了微服务架构在后端系统设计中的关键作用,分析了其优势、挑战与实施策略。通过比较传统单体应用与微服务的异同,文章阐述了微服务如何促进敏捷开发和持续交付,同时指出了在采用微服务时可能遇到的技术债务和管理复杂性问题。结合具体案例,本文为读者提供了关于如何有效实施微服务的实用建议。 【7月更文挑战第21天】
|
3天前
|
安全 编译器 API
探索PHP 8的新特性及其对现代Web开发的影响
随着PHP 8的发布,这一广泛使用的服务器端脚本语言迎来了重大升级。本文将深入探讨PHP 8引入的关键新特性,包括JIT编译器、联合类型、命名参数、匹配表达式等,以及这些特性如何提升性能、增强类型安全和改善开发者体验。同时,我们将分析这些变化对于现代Web开发实践的具体影响,以及它们如何塑造了PHP的未来发展方向。
9 1
|
1天前
|
前端开发 JavaScript 数据管理
现代Web开发中的前端框架选择指南
选择合适的前端框架是现代Web开发中的关键决策之一。本文探讨了几种流行的前端框架,比较它们的特点和适用场景,帮助开发者在众多选项中做出理性的选择。
|
1天前
|
缓存 前端开发 JavaScript
现代Web开发中的前端性能优化策略
在当今快节奏的Web开发环境中,前端性能优化是确保用户体验和网站成功的关键。本文探讨了一些实用的前端性能优化策略,涵盖了从代码优化到资源加载的各个方面,帮助开发者有效提升网页加载速度和响应性能。
|
1天前
|
运维
什么说Lambda架构给开发和运维带来了“深重的灾难”
什么说Lambda架构给开发和运维带来了“深重的灾难”
|
1天前
|
前端开发 JavaScript 数据处理
深入Python Web开发:模板引擎的力量与最佳实践
【7月更文挑战第21天】Python Web开发中,模板引擎如Jinja2促进MVC架构的View层,分离后端数据与前端展示,提升开发效率和代码复用。选择适合的模板引擎,利用其数据注入、模板继承等特性,保持模板简洁,注重安全性,是最佳实践。例如,Jinja2允许在HTML中嵌入变量并处理循环,简化渲染过程。
7 0
|
2天前
|
编解码 前端开发 JavaScript
现代Web开发中的前端技术趋势与挑战
随着互联网的迅猛发展,现代Web开发中前端技术正日益成为关注的焦点。本文探讨了当前前端技术的主要趋势和面临的挑战,从性能优化到跨平台适配,为开发者提供了深入的洞见和解决方案。
|
3天前
|
安全 编译器 测试技术
PHP 8新特性解析及其对现代Web开发的影响
本文将深入探讨PHP 8中引入的关键新特性,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些变化如何优化现代Web开发流程。通过实例演示和性能比较,揭示升级至PHP 8的益处与挑战,为开发者提供升级决策的参考依据。
5 0
|
3天前
|
存储 负载均衡 开发者
深入理解微服务架构中的服务发现机制
【7月更文挑战第19天】在微服务架构的海洋中,服务发现是一艘至关重要的航船,它指引着各个微服务之间的通信与协作。本文将揭开服务发现的神秘面纱,探索其工作原理、实现方式及面临的挑战,为开发者提供清晰的导航,确保服务间的顺畅航行。