Spring DI 简单演示三层架构——Setter 注入

Spring IOC 的常见注入方法有3种:Setter注入、构造注入属性注入。想了解更多可点击链接:Spring 注入、注解以及相关内容补充

        属性注入 不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。所以我只演示Setter注入构造注入。本篇演示Setter注入

首先新建项目,可参考 初识IDEA、模拟三层--控制层、业务层和数据访问层

一、spring 环境搭建

(一)pom.xml 导相关坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<!--    导坐标,不导入该坐标会影响xml文件创建
导完坐标,一定去该页面右边点开 Maven看看是否下载完成,
若不报错,即下载成功--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.28</version></dependency></dependencies><groupId>org.example</groupId><artifactId>Spring_ioc_04</artifactId><version>1.0-SNAPSHOT</version></project>

(二)搭建配置文件

依次点击:src ==> main ==> resource 右击  ==> New ==> 找 XML Configuration File ==> 找到 Spring Config 并点击,起名(自己随便起名字),为了好区分,我起名叫 applicationContext

(三)建包建类,写方法

        建包建类,写方法可参考模拟三层--控制层、业务层和数据访问层,我们建立dao 包、 service 包、controller 包和 test 包。dao 包、 service 包和 controller 包这三个包分别写三层的接口和实现类,名字随便起的,习惯了“Student”,我给所有的名字都包含了“Student” ,其实“Student”没啥意义,“IUserDao"或”bsygd"这样随便的名字都行,什么的名字都一样的意义,取名自己好区分好记住就行(不过为了好区分,最好数据访问层、业务层、控制层起名都包含各自的dao 、service、controller字样,接口都 I 开头、实现类都 imp 结尾)。text 包就写测试类,因为本片文章简单演示而已,我们就简单的给每个接口写个 save() 新增方法给大家演示吧,具体代码如下:

//dao 数据访问层的接口
package com.apesource.pojo.dao;public interface IStudentDao {public void save();
}
//dao 数据访问层的实现类
package com.apesource.pojo.dao;public class StudentDaoImp implements IStudentDao{@Overridepublic void save() {System.out.println("===dao的新增方法===");}
}
//service 业务层接口
package com.apesource.pojo.service;public interface IStudentService {public void save();
}
//service 业务层实现类
package com.apesource.pojo.service;import com.apesource.pojo.dao.IStudentDao;public class StudentServiceImp implements IStudentService{/*因为 service 层调用数据访问层*我们得将 dao 层与 service 联系起来*拿到一个 实现dao层方法的变量,又由于我们要使用 setter 方法注入* 所以我们要写它的 setter 方法*/IStudentDao dao;public void setDao(IStudentDao dao) {this.dao = dao;}@Overridepublic void save() {System.out.println("===service的新增方法===");//调用 dao 层方法dao.save();}
}
//controller 控制层接口
package com.apesource.pojo.controller;public interface IStudentController {public void save();
}
//controller 控制层的实现方法
package com.apesource.pojo.controller;import com.apesource.pojo.dao.IStudentDao;
import com.apesource.pojo.service.IStudentService;public class StudentControllerImp implements IStudentController{/*因为 controller 层调用数据访问层*我们得将 controller 层与 service 联系起来*拿到一个实现 service 层方法的变量,又由于我们要使用 setter 方法注入* 所以我们要写它的 setter 方法*/IStudentService service;public void setService(IStudentService service) {this.service = service;}@Overridepublic void save() {System.out.println("===contro的新增方法===");//调用 service 层方法service.save();}
}

(四)找到需要以解耦方式获取实例的类,将需要spring管理的类注入,通过 application.xml 配置文件的操作

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--注入数据访问——dao实现类--><!--<bean id="可以自己起名,先写 class,再写 id,系统会自动生成 id 名,很方便" class="实现类或需要解耦的类的路径"></bean>--><bean id="daoImp" class="com.apesource.dao.StudentDaoImp"></bean><!--注入业务——service实现类--><!--业务层需要数据访问层层对象注入,DI实现,子标签--><!--property 子标签,就用于 setter 注入,它也会有自动生成的 name,可以改自己起的名,自动生成很方便--><!--property的name指要通过 setter给注入的属性名--><!--property的value指要通过 setter给注入的数据,写具体值--><!--property的ref可以直接引用标签id--><bean id="serviceImp" class="com.apesource.service.StudentServiceImp"><!--通过 setter给注入的dao(就我们service层添加的那个dao层的属性【IStudentDao dao】),ref可以直接引用数据访问层id,这样两层就关联起来了,控制层同理--><property name="dao" ref="daoImp"></property></bean><!--注入控制器——controller实现类--><!--控制层需要业务层对象注入,DI实现--><bean id="controllerImp" class="com.apesource.controller.StudentControllerImp"><property name="service" ref="serviceImp"></property></bean>
</beans>

(五)测试类

package com.apesource.test;import com.apesource.controller.IStudentController;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//注意:千万不要忘记 main 主方法
public class Test01 {public static void main(String[] args) {//1.加载 Spring 核心配置文件,获取 Spring 容器对象//applicationContext.xml为建完坐标下一步自己建立的那个 xml 配置文件的名字ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取对象【.getBean("controllerImp")这个controllerImp是 xml 配置文件控制层标签的 id】IStudentController controllerImp = (IStudentController) applicationContext.getBean("controllerImp");controllerImp.save();//看它是否三层关联调用方法}
}

运行结果(控制层显示出数据访问层方法结果,三层关联成功):

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv 控制鼠标键盘实现功能setMouseCallback

鼠标事件类型 OpenCV 支持多种鼠标事件类型&#xff0c;常见的包括&#xff1a; cv2.EVENT_LBUTTONDOWN&#xff1a;左键按下 cv2.EVENT_RBUTTONDOWN&#xff1a;右键按下 cv2.EVENT_MBUTTONDOWN&#xff1a;中键按下 cv2.EVENT_LBUTTONUP&#xff1a;左键释放 cv2.EVENT_RBUTT…

HOW - 用腾讯蓝盾部署一个 Web 应用

目录 一、介绍二、项目、流水线和 Stage1. 项目&#xff08;Project&#xff09;2. 流水线&#xff08;Pipeline&#xff09;3. Stage&#xff08;阶段&#xff09;示例&#xff1a;配置一个简单的 CI/CD 流程的基本步骤总结 三、一条完整的流水线包括什么 Stage1. 源代码管理&…

数据库-DML语言-数据操作语言

定义 DML是对表中数据进行操作的语言&#xff0c;涉及的关键字:INSERT UPDATE DELETE INSERT:向表中插入新数据的语句UPDATE:修改表中数据的语句DELETE:删除表中数据的语句 准备工作 USE mydb; 使用mydb库 CREATE TABLE person( 创建表personname VARCHAR(30),age INT…

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…

高德地图SDK Android版开发 5 地图交互操作

高德地图SDK Android版开发 5 地图交互操作 前言控件控件介绍接口UiSettingsAMapOptions 示例代码Logo指南针比例尺缩放按钮 效果图 地图手势地图手势方法说明地图手势开关指定屏幕中心点的手势操作 地图手势事件地图点击事件监听接口地图长按事件监听接口地图触摸事件监听接口…

Python 6行代码写北京时间时钟(10帧 可调) 天地良心

今天看到别的大佬用Python写时钟 我密集恐惧症都犯了 十来个定义函数 我看也看不懂 代码还有整整78行 还是在我改良后的 改良前有98行 我删注释 优化函数名(比如把penup改成pu) 这个文件照样有5KB 并且在帧数取决于电脑性能 我运行了一下 电脑都卡出蓝屏了 于是我连夜赶…

云动态摘要 2024-08-12

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 全球加速 GA - 新增“巴西&#xff08;圣保罗&#xff09;”、“沙特&#xff08;利雅得&#xff09;”接入点 华为云 2024-08-12 全球加速服务新增开通“巴西&#xff08;圣保罗&#xff09;”、“沙特&a…

CAN总线-----帧格式

目录 前言 一、CAN总线帧格式分类 1.数据帧&#xff08;重点&#xff09; 2.遥控帧 3.错误帧 4.过载帧 5.间隔帧 二、位填充 三、波形实例 前言 本期我们就开始学习CAN总线的帧格式&#xff0c;对应帧格式的话&#xff0c;在前面我们学习I2C协议和SPI协议等协议的时候…

使用功率器件比如MOSFET瞬态热阻曲线计算参数

使用功率器件比如MOSFET瞬态热阻曲线计算参数 1.概述2.查看 ZθJC 图3.使用 ZθJC 图估算结温升4.应用案例5.使用 ZθJC 图估算 MOSFET 峰值电流能力6.应用实例 资料来自网络&#xff0c;仅供学习使用 1.概述 功率 MOSFET 数据表包括归一化瞬态热阻抗图&#xff1a;结至外壳 …

怎么将pdf转为ppt文件?pdf转ppt的8个方法

在诸多职场与学术交流的场合中&#xff0c;我们时常面临将详尽的PDF文件转化为生动且易于编辑的PPT演示文稿的需求。这一转换不仅是为了满足演示时的灵活性&#xff0c;更是为了提升信息传递的效率与观众的理解度。从简单的在线工具到功能全面的专业软件&#xff0c;我们拥有多…

概要设计遇到需求变更,6大应对措施

有效地应对概念设计过程中的需求变更&#xff0c;有助于项目灵活适应市场与用户变化&#xff0c;减少后期调整成本&#xff0c;提升产品竞争力与用户满意度&#xff0c;促进项目顺利推进和高质量交付。未能及时有效应对概念设计中的需求变更&#xff0c;往往会导致项目偏离原定…

“论NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

[C++] STL (multi)map/(multi)set简介

标题&#xff1a;[C] STL (multi)map/(multi)set简介 水墨不写bug 目录 前言&#xff1a; 一、set简介 1.set简介 2.set的常见用法 二、map简介 1.map简介 2.map使用 三、multiset简介 1.multiset简介 2.multiset使用 四、multimap简介 1.multimap简介 2.multim…

24小时不间断守护:输电线路防山火在线监测装置|防山火利器

24小时不间断守护&#xff1a;输电线路防山火在线监测装置|防山火利器 “一年之计在于秋”虽然传统上强调秋季作为收获与规划的重要时节&#xff0c;但同时也提醒我们&#xff0c;这个季节也伴随着一系列的自然挑战&#xff0c;如火灾风险的增加。针对输电线路而言&#xff0c…

制造业生产管理的困境及MES系统解决方案介绍:盘古信息IMS

在当今竞争激烈的制造业环境中&#xff0c;企业面临着前所未有的生产管理挑战。从计划执行的灵活性不足、过程监控的缺失&#xff0c;到质量控制的挑战、供应链协同的难题&#xff0c;每一个环节都亟需创新与优化。盘古信息MES系统&#xff0c;作为全球领先的制造运营管理工业软…

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器&#xff08;Garbage First垃圾优先&#x…

MySQL:查询(万字超详细版)

&#x1f48e;所属专栏&#xff1a; MySQL &#x1f48e;1. 单表查询 &#x1f48e;1.1 全列查询和指定列查询 全列查询&#xff1a; select * from exam; 在实际开发中不要使用 * 来进行查询&#xff0c;因为数据库会很大&#xff0c;影响效率 指定列查询&#xff1a; se…

IPC进程间通信

信号 信号是一种终端机制&#xff0c;程序运行到一半的时候接收到了某种通知&#xff0c;程序就会立刻中断运行&#xff0c;转而去处理通知。 登记信号 一个进程只会接收默认的几个信号 如果想要让一个进程接收特定信号的话&#xff0c;必须提前在该进程中登记一下想要接收…

如何进行长截图的两种方法

前言 本文主要讲2种截图方式&#xff0c;分别是谷歌和QQ。 谷歌分为Web端 和 移动端&#xff0c;选一种即可。 第一种&#xff1a;谷歌浏览器控制台自带的 1.先把控制台语言更改为中文&#xff0c;方便查看 ①.按F12&#xff0c;点击设置面板 ②.修改语言为中文并关闭 ③.点击…

2024-08-07升级记录:北斗卫星导航系统轨道信息解释

北斗三号全球星座由地球静止轨道&#xff08;GEO&#xff09;、倾斜地球同步轨道&#xff08;IGSO&#xff09;、中圆地球轨道&#xff08;MEO&#xff09;三种轨道卫星组成&#xff0c;北斗人称这三种卫星为“北斗三兄弟”。 三种轨道区别&#xff1a; 1、GEO卫星 位于距地球约…