Spring:泛型依赖注入

news2024/12/23 4:22:34

Spring

  • 泛型依赖注入
    • 问题解决

在这里插入图片描述

泛型依赖注入

泛型:具有占位符(类型参数)的类、结构、接口和方法,通过 <> 的方式定义了一个形式参数,在实例化时再指明具体类型

依赖注入:IoC 的具体实现,指对象之间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式

泛型依赖注入:在进行依赖注入的同时,使用泛型将可重复使用的代码提取在相同地方中,可以简化代码,提高代码复用性,便于维护和修改

简单示例:
首先创建学生和教师两个实体类,定义编号和姓名两个属性:

package cn.edu.springdemo.model;

//学生类
public class Student {
    private int id ; //学号
    private String name ; //姓名

    public Student() {
        super();
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
package cn.edu.springdemo.model;

//教师类
public class Teacher {
    private int id; //职工号
    private String name; //姓名

    public Teacher() {
        super();
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

然后定义一个接口 StudentDao ,声明一个 Update 方法:

package cn.edu.springdemo.dao;

import cn.edu.springdemo.model.Student;

public interface StudentDao {
    public void Update(Student student);
}

定义一个接口 TeacherDao ,同样声明一个 Update 方法:

package cn.edu.springdemo.dao;

import cn.edu.springdemo.model.Teacher;

public interface TeacherDao {
    public void Update(Teacher teacher);
}

两个接口都有 Update 方法,可以将其提取在同一地方。即定义一个泛型 GenericsDao ,通过类型参数来实现代码复用以提高代码的编写效率:

package cn.edu.springdemo.dao;

//泛型
public class GenericsDao<T> {
	//定义形式参数,调用时再具体指明
    public void Update(T t){
        System.out.println(t);
    }
}

再创建对应接口的实现类,并继承泛型 GenericsDao 和传入对应的类型:

package cn.edu.springdemo.dao;

import cn.edu.springdemo.model.Student;
import org.springframework.stereotype.Repository;

//通过注解方式配置 bean 示例
@Repository("studentDao")
public class StudentDaoImpl extends GenericsDao<Student> implements StudentDao {
    // Update 方法无需再写
}
package cn.edu.springdemo.dao;

import cn.edu.springdemo.model.Teacher;
import org.springframework.stereotype.Repository;

@Repository("teacherDao")
public class TeacherDaoImpl extends GenericsDao<Teacher> implements TeacherDao {
    //同样 Update 方法无需再写
}

同理,在 Service 层中将可重复使用的注入代码提取在泛型 GenericsService 中:

package cn.edu.springdemo.service;

import cn.edu.springdemo.dao.GenericsDao;
import org.springframework.beans.factory.annotation.Autowired;

public class GenericsService<T> {
    @Autowired
    protected GenericsDao<T> genericsDao; //泛型注入
}

接着定义 StudentService 和 TeacherService 接口,声明一个 Update 方法;
再让其实现类继承泛型 GenericsService ,调用 genericsDao 属性即可:

package cn.edu.springdemo.service;

import cn.edu.springdemo.model.Student;
import org.springframework.stereotype.Service;

@Service("studentService")
public class StudentServiceImpl extends GenericsService<Student> implements StudentService {
    @Override
    public void Update(Student student) {
        genericsDao.Update(student);
    }
}
package cn.edu.springdemo.service;

import cn.edu.springdemo.model.Teacher;
import org.springframework.stereotype.Service;

@Service("teacherService")
public class TeacherServiceImpl extends GenericsService<Teacher> implements TeacherService {
    public void Update(Teacher teacher){
        genericsDao.Update(teacher);
    }
}

最后测试结果:

package cn.edu.springdemo.test;

import cn.edu.springdemo.service.StudentService;
import cn.edu.springdemo.service.TeacherService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AdminTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("annontationDemo.xml");
        
        StudentService studentService = (StudentService) applicationContext.getBean("studentService");
        System.out.println(studentService);

        TeacherService teacherService = (TeacherService) applicationContext.getBean("teacherService");
        System.out.println(teacherService);
    }
}

结果如图:
在这里插入图片描述

问题解决

报错:Could not autowire. No beans of ‘GenericsDao’ type found. more… (Ctrl+F1)
解决:其实并没有错误,对运行结果没有影响。但看起来不太舒服,解决办法只需要降低错误级别即可

在这里插入图片描述

步骤:点击 File ,点击 Settings… ,弹出窗口选择 Editor ,然后点击 Inspections ,找到 Spring ,选择 Spring Core 和 Code ,点击 Autowiring for Bean Class ,最后在右侧的 Severity 下,将 Error 级别降低为 Warning 。如图:
在这里插入图片描述

问题成功解决。如图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升性能的利器:理解线程池的使用、工作原理和优势

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览2.1 为什么创建和销毁线程开销较大2.2 为什么要使…

【C++从0到王者】第十三站:vector源码分析及手把手教你如何写一个简单的vector

文章目录 一、vector的源码分析1.分析思路2.构造函数和插入接口 二、手把手教你写一个简单的vector1.基本结构2.迭代器与私有成员变量的定义3.构造函数4.size和capacity5.迭代器函数接口6.析构函数7.reserve接口8.尾插9.operator[]运算符重载10.简单的测试前面的接口11.insert以…

【Spring框架】Spring读取与存储综合练习

练习 在 Spring 项⽬中&#xff0c;通过 main ⽅法获取到 Controller 类&#xff0c;调⽤ Controller ⾥⾯通过注⼊的⽅式调⽤ Service 类&#xff0c;Service 再通过注⼊的⽅式获取到 Repository 类&#xff0c;Repository 类⾥⾯有⼀个⽅法构建⼀个 User 对象&#xff0c;返…

力扣 7月27日每日一题 2500. 删除每行中的最大值

题目连接 》2500. 删除每行中的最大值 有一句话这么说的&#xff1a;不用把人生的每一个目标都定在年龄线上&#xff0c;人生的本质是体验&#xff0c;感悟&#xff0c;和成长。什么年龄该干什么事本来就是一个伪命题。事实上&#xff0c;当你找到你热爱的东西&#xff0c;你…

C++之std::function总结(一百六十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug

未经允许&#xff0c;本文不得转载&#xff0c;vx&#xff1a;837007389 文章目录 step1&#xff1a;下载专业版本的pycharmstep2 配置自动同步文件夹&#xff0c;即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…

【Docker】初识Docker以及Docker安装与阿里云镜像配置

目录 一、初识Docker 二、安装Docker 三、Docker架构 四、配置Docker镜像加速器 一、初识Docker Docker是一个开源的应用容器引擎&#xff0c;诞生于2013年&#xff0c;基于Go语言实现&#xff0c;dotCloud公司出品&#xff0c;Docker开源让开发者打包他们的应用以及依赖包到…

SpringMVC-mybatis,SQL语句中误用了desc关键字,导致报错。

17-Jul-2023 21:26:22.295 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath 17-Jul-2023 21:26:22.621 淇℃伅 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalin…

TOP命令参数详解

非常详细的top命令介绍&#xff0c;感谢网友分享&#xff0c;参考地址如下 1、TOP命令参数详解---10分钟学会top用法 - 知乎 摘录几个之前不常用的&#xff0c;可能会用到的命令&#xff1a; 1、MEM vs SWAP 第四第五行分别是内存信息和swap信息&#xff0c;所有程序的运行都…

计算机网络网--应用层

目录 应用层概述1.进程通信2. 供应用程序使用的运输服务3.因特网提供的运输服务 一.网络应用模型1.1 C/S模型&#xff08;client/server&#xff0c;客户/服务器模型&#xff09;定义工作原理功能特点优势应用 1.2 P2P&#xff08;peer to peer&#xff09;模型 与 P2P文件分发…

Golang安装

目录 Go安装下载安装Go Go安装 下载安装Go 地址&#xff1a;https://studygolang.com/dl 1、根据系统来选择下载包。 2、我是Window&#xff0c;所以直接下载windows的安装包来安装。 3、在控制台窗口输入“go version”可查看Go版本&#xff0c;检测是否安装成功。 4、配置…

浅谈es5如何保证并发请求的返回顺序

最近在公司实习写的是es5&#xff0c;在和回调地狱经过一番拉扯之后写下这篇文章&#xff0c;也算是体验了一把没有promise的时代 假设我们的div有一个日历列表&#xff0c;但是由于大小关系只能每次显示2天的信息&#xff0c;项目限制只能使用es5&#xff0c;不能使用es6的pro…

WMS是什么意思,WMS有什么功能

阅读本篇文章&#xff0c;您可以了解到&#xff1a;1、WMS的定义&#xff1b;2、WMS的功能&#xff1b;3、WMS的好处&#xff1b;4、WMS的未来。 一、WMS的定义 WMS全称为Warehouse Management System&#xff0c;即仓库管理系统&#xff0c;是一种用于管理和控制仓库操作的软…

Java 中的 ArrayList 和 LinkedList

一、Java 中的列表 1.1 介绍 列表是一种数据结构&#xff0c;为了方便理解&#xff0c;我们可以认为它是动态的数组。众所周知&#xff0c;数组的大小在定义的时候就固定了&#xff0c;不可改变&#xff0c;那么它就无法存储超过它容量的数据&#xff0c;而列表的容量是无限大…

OSI 7层模型 TCPIP四层模型

7层模型&#xff1a; 各层的用途&#xff1a; 应用层&#xff1a;实现各应用之间信息交换的服务&#xff0c;定义了各个应用传输信息格式&#xff0c;即&#xff0c;定义了传输信息的协议&#xff08;如Web应用的传输信息协议 HTTP、远程登录协议Telnet、安全的网络传输协议SS…

机器人制作开源方案 | 可变式智能正姿椅

作者&#xff1a;吴菁菁 徐乐 张志强 单位&#xff1a;河海大学 指导老师&#xff1a;施敏虎 赵建华 一、作品简介 1. 作品介绍 久坐本身及其导致的各种错误坐姿行为常常会引发一系列健康问题&#xff0c;不利于人体健康。 椅子作为人在久坐状态下与人体接触时间最长的工具则…

【Unity实用插件篇】| A* Pathfinding Project - A*寻路插件 的使用教程

前言【Unity实用插件篇】| A*寻路插件学习使用一、A*算法 简述二、A* Pathfinding Project 介绍2.1 A* Pathfinding Project 功能2.2 相关链接2.3 标准版和Pro版区别2.4 A* Pathfinding Project Free与Navigation的对比三、快速搭建一个自己的场景测试寻路3.1 寻路场景搭建3.2 …

大型系统的任务调度模块实现思路

产品需求&#xff1a;需要一个任务调度模块&#xff0c;用户可以通过页面去新建任务&#xff0c;任务主要就是定时发送邮件&#xff0c;或者每周几去发送邮件&#xff0c;用户可以自定义发送的规则&#xff0c;且用户可以暂停任务、删除任务&#xff0c;也能知道任务的执行情况…

查找-多路查找详解篇

多路查找树 多路查找树&#xff08;Multway Search Tree&#xff09;是一种高级的树形数据结构&#xff0c;它 允许每个节点有多个子节点&#xff08;通常大于等于2&#xff09;。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树&#xff08;2-3 Tree&#x…

红队打靶,红日系列,红日靶场5

文章目录 靶场详情外网渗透端口扫描漏洞发现与利用获取shell 内网渗透提权内网信息收集 横向移动上线msf路由转发与代理通道Psexec 攻击 靶场详情 此次靶场虚拟机共用两个&#xff0c;一个外网一个内网&#xff0c;用来练习红队相关内容和方向&#xff0c;主要包括常规信息收集…