首页 > 其他分享 >(IOC&DI)部门信息管理功能分层解耦优化

(IOC&DI)部门信息管理功能分层解耦优化

时间:2024-11-16 12:19:38浏览次数:3  
标签:Service DI Autowired List 信息管理 DeptService 注解 IOC public

一、优化分析

@RestController
public class DeptController {
    private DeptServiceimpl Service = new DeptServiceimpl();

  在之前的代码每一层在调取上一层的业务功能的时候都是new一个新对象出来之后再进行调取,但是这样的做法层与层之间的耦合太强,而且不利于代码的维护和扩展,本节基于面向接口编程和Springboot底层的IOC&DI对代码进行优化,分层解耦。

控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为Bean。

二、优化具体实现

1. 将Dao 及 Service层的实现类,交给IOC容器管理

2. 为Controller 及 Service注入运行时所依赖的对象。

Spring IOC 容器通过注解(如 @Controller@Service@Repository)自动扫描和注册组件,容器会自动创建这些组件的实例并管理它们的生命周期。

以下是项目中由 Spring 容器管理的类:

  • Controller 层DeptController
    • 使用 @RestController 注解,Spring 自动扫描并注册为控制器组件。
  • Service 层DeptServiceimpl
    • 使用 @Service 注解,Spring 自动注册为服务组件。
  • DAO 层DeptDaoimpl
    • 使用 @Repository 注解,Spring 自动注册为数据访问组件。

Dao:

  优化点

  使用了 @Repository 注解标记为 DAO 层组件,便于 Spring 管理。

  将数据获取逻辑独立封装在 DAO 层,服务层只需要调用接口获取数据,而无需关心文件读取的      具体实现。

public interface DeptDao {
    public List<String> get() throws IOException;
}
@Repository
public class DeptDaoimpl implements DeptDao {
    public List<String>  get() throws IOException {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
        List<String> lines = IOUtils.readLines(inputStream, "UTF-8");
        return lines;
    }
}
DeptService:

    优化点

    依赖注入(DI):使用 @Autowired 注入了 DAO 层接口(DeptDao),实现了对 DAO 层的解耦,

    不再手动创建 DeptDaoimpl 对象。容器会将 DeptDaoimpl 的实例自动注入到 dao 属性。

public interface DeptService {
    public List<Dept> list() throws Exception;
}
@Service
public class DeptServiceimpl implements DeptService {
    @Autowired
    private DeptDao dao;
    public List<Dept> list() throws Exception {
        List<String> lines = dao.get();
        List<Dept> list = lines.stream().map(line -> {
            String[] args = line.split(",");
            int id = Integer.valueOf(args[0]);
            String name = args[1];
            LocalDateTime data = LocalDateTime.parse(args[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            return new Dept(id, name, data);
        }).toList();
        return list;
    }
}
DeptController :

    优化点

    使用了 @Autowired 注解,将 DeptService 接口注入,而不直接依赖具体实现类(如                      DeptServiceimpl)。

@RestController
public class DeptController {
    @Autowired
    private DeptService Service;
    @GetMapping("/depts")
    public Result list() throws Exception {
//        src/main/resources/dept.txt
        List<Dept> deptlist = Service.list();
        return Result.success(deptlist);
    }

}

三、扩展

声明bean的注解要想生效,需要被扫描到,启动类默认扫描当前包及其子包。

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报错误

解决方案:
        方案一:@Primary:

@Primary
@Component
public class DeptServiceImpl implements DeptService {
    @Override
    public List<String> queryDeptList() {
        // 略……
    }
}

        方案二:@Qualifier:

@RestController
public class DeptController {
    @Autowired
    @Qualifier("deptServiceImpl")
    private DeptService deptService;
}

        方案三:@Resource:

@RestController
public class DeptController {
    @Resource(name = "deptServiceImpl")
    private DeptService deptService;
}

四、总结

通过优化后:

  1. 分层解耦

    • DAO、Service、Controller 三层通过接口实现解耦,层与层之间仅依赖接口而非具体实现。
  2. 使用注解简化开发

    • @Autowired:实现依赖注入,提升代码的可读性和扩展性。
    • @Service@Repository:明确组件职责,方便 Spring 容器管理。
  3. 可扩展性提升

    • 面向接口编程使得后续更换实现(如切换到数据库存储)变得简单。

标签:Service,DI,Autowired,List,信息管理,DeptService,注解,IOC,public
From: https://blog.csdn.net/zzb1580/article/details/143814959

相关文章

  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • Gin链接Redis
    packagecacheimport("context""fmt""WchimeGinSystem/conf""log""time""github.com/go-redis/redis/v8")varCTX=context.Background()varRDB*redis.Clientfuncc......
  • Codeforces Round 987 (Div. 2)
    CodeforcesRound987(Div.2)总结A常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的\(a\)序列保证不上升,所以只需要考虑相同长度的一段。#include<iostream>#include<cstdio>#include<cstring>#......
  • Codeforces Round 983 (div 2)
    A.CircuitAlicehasjustcraftedacircuitwith\(n\)lightsand\(2n\)switches.Eachcomponent(alightoraswitch)hastwostates:onoroff.Thelightsandswitchesarearrangedinawaythat:Eachlightisconnectedtoexactlytwoswitches.Ea......
  • Linux系统-redis集群、nacos、nginx、keepalived、mysql开机自启
    一、Redis集群开机自启:如三主三从交叉式redis集群,有两个方法,自行选择。方法一:第一步:分别在各节点添加以下redis.service文件命令:vim/lib/systemd/system/redis_6379.service添加:[Unit]Description=Redispersistentkey-valuedatabaseAfter=network.targetAfter=......
  • 基于springboot+vue的野生动物信息管理系统-毕业设计论文(源码+论文+部署讲解等)
    ......
  • DAY64||dijkstra(堆优化版)精讲 ||Bellman_ford 算法精讲
    dijkstra(堆优化版)精讲题目如上题47.参加科学大会(第六期模拟笔试)邻接表本题使用邻接表解决问题。邻接表的优点:对于稀疏图的存储,只需要存储边,空间利用率高遍历节点链接情况相对容易缺点:检查任意两个节点间是否存在边,效率相对低,需要O(V)时间,V表示某节点链接其他节点的数......
  • Solution - Codeforces 2031F Penchick and Even Medians
    飞快秒掉了,没报名痛失首杀,痛苦。简略题解:考虑先随机二元下标\((x_0,y_0)\)满足删去\((x_0,y_0)\)后查询的中位数还是\(\frac{n}{2},\frac{n}{2}+1\),那么这就说明\(p_{x_0},p_{y_0}\)一定在中位数的两边。那么还剩下的\(n-2\)个下标两两配对成\(\frac{n-2}{......
  • 2024.11.15 Codeforces Round 987(Div. 2)
    Solved:5/6Rank:74比赛链接A.PenchickandModernMonument给定一个不增序列,修改最少的数字使其不降。全都修改为出现次数最多的数即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){intn;cin>>n;vector<int>a(n);......
  • Android 音频采集 - AudioRecord
    一、概述AudioRecord是Android平台比较重要的类,也是Java接口中比较偏底层(平台)的接口,可以通过它从平台的音频输入硬件来获取原始音频PCM数据。它的工作原理是要需要通过应用侧轮询调用read接口来驱动,每调用一次,系统就会从硬件采集到的数据填充一次,至于传递数据的......