面试官:为什么要用 Spring?它到底解决了什么问题?
上一篇:Intellij IDEA 神级插件!效率提升 10 倍!
为什么要用 Spring?它到底解决了什么问题?
目的:对比传统方式和 Spring注入方式创建对象以达到解耦的目的,以Service层调用 Dao层为例。
方式一:传统方式
1.Service层
/*** @author :Prannt* @description :Service层* @program : Test*/
public class UserService {public void add(){System.out.println("service add...");UserDao dao = new UserDaoImpl();dao.query();}
}
2.UserDao接口
/*** @description :接口中只有一个抽象方法*/
public interface UserDao {void query();
}
3.UserDao接口的实现类
/*** @description :接口的实现类,重写 query方法*/
public class UserDaoImpl implements UserDao{@Overridepublic void query() {System.out.println("dao query...");}
}
//测试
public class test {@Testpublic void test1(){UserService service = new UserService();service.add();}
}
测试结果:
结论一:由以上过程可以看出,在UserService类中直接调用实现类的query方法,一旦实现类出问题,UserService立即报错,具有高度的耦合性
方式二:Spring注入对象
1.xml文件配置bean
<?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"><bean id="userService" class="Service.UserService"><!--注入Dao对象--><property name="dao" ref="Dao"></property></bean><bean id="Dao" class="Dao.UserDaoImpl"></bean>
</beans>
2.Service层
import Dao.UserDao;
/*** @author :Prannt* @description :* @program : Demo01*/
public class UserService {public void add(){System.out.println("service add......");dao.update();}//创建dao类型的属性,生成对应的set方法private UserDao dao;public void setDao(UserDao dao) {this.dao = dao;}
}
3.UserDao接口
public interface UserDao {void update();
}
4.接口的实现类
public class UserDaoImpl implements UserDao{@Overridepublic void update() {System.out.println("Dao update......");}
}
测试
import Service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestBean {@Testpublic void testBean(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");UserService userService = context.getBean("userService",UserService.class);userService.add();}
}
测试结果
结论二:观察以上过程,在UserService类中,没有直接new实现类,而是通过将Dao注入外部配置文件中的方式,使用“第三方文件”来达到解耦的目的。
总结
第一种传统方式创建对象,就像图一中的齿轮组。如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。
而用Spring注入对象犹如图二的齿轮,利用第三方xml文件使任意两个齿轮之间无必然联系,B齿轮坏了也影响不到A、C、D齿轮。齿轮组相互之间的依赖关系降到最低。
原文链接:https://blog.csdn.net/qq_38050259/article/details/113414419
感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。
· END ·
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
正文结束
推荐阅读 ↓↓↓
1.心态崩了!税前2万4,到手1万4,年终奖扣税方式1月1日起施行~
2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?
3.从零开始搭建创业公司后台技术栈
4.程序员一般可以从什么平台接私活?
5.清华大学:2021 元宇宙研究报告!
6.为什么国内 996 干不过国外的 955呢?
7.这封“领导痛批95后下属”的邮件,句句扎心!
8.15张图看懂瞎忙和高效的区别!
面试官:为什么要用 Spring?它到底解决了什么问题?相关推荐
- 百度面试官:来聊聊Spring吧
文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...
- 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???
华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...
- 面试官角度看应聘:问题到底出在哪?(下)
作者简介:堂主,2006 年开始沉迷前端领域.工作历经淘宝前端开发团队.蘑菇街前端团队,现为政采云前端团队(ZooTeam)负责人,好烟不好酒,半个茶人. 本篇是<面试官角度看应聘:问题到底出在 ...
- 【232期】面试官:如何保护 Spring Boot 配置文件敏感信息?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- 面试官:兄弟,说说Java到底是值传递还是引用传递
二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...
- 面试官:工作中遇到难题怎么解决的?看似送分题实则”送命”
"金九银十"跳槽季,不少职场的新人,在面对这个问题是无从下手,甚至很多职场老人也会措手不及,尴尬的说:"工作中没有什么难题吧,基本上都可以解决."如果我们这样回 ...
- 面试官欺负人:new Object()到底占用几个字节?
前言 我们来分析一下堆内布局以及Java对象在内存中的布局吧. 对象的指向 先来看一段代码: package com.zwx.jvm;public class HeapMemory {private ...
- 程序员面试怎么回答面试官:你对Spring的理解?
spring呢,是pivotal公司维护的一系列开源工具的总称,最为人所知的是spring mvc,事实上,他们都是基于spring framework,并且再其上继续增强,为某一方面服务的java组 ...
- 面试官问我:spring、springboot、springcloud的区别,我笑了
好吧,可能某些项目还在使用dubbo,但是你也一定听过Spring Cloud.至于Spring和Spring Boot,对于现在的Java开发,它们的地位简直可以说是不可或缺了.如果你的新项目在使用 ...
- 吊打面试官系列之--吃透Spring ioc 和 aop (中)
目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...
最新文章
- 【微信小程序企业级开发教程】界面刷新获取新更新数据
- python将数据存入mysql数据库中_python3 两种方法将数据存入mysql数据库
- 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
- mybatis中存储过程的调用
- 《TensorFlow技术解析与实战》——1.2 什么是深度学习
- Qcom平台添加 Camera 驱动(msm8953)
- react+ts+gulpjs将插件转成umd.js文件
- redis通过key模糊搜索_Redis中关于Key的模糊查找
- Unity:编辑器Editor常用命令
- 免费的crm系统部署在自己的服务器,crm系统本地部署与云端部署的区别
- asp毕业设计——基于asp+access的学生成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统
- Oracle中的NVL()函数的用法
- CSDN文章摘要自定义修改
- 嵌入式Linux中间件,高可用性(HA)和嵌入式管理中间件:Enea Element详解
- TradingView - K线 使用详解
- Fiddler抓包工具是最强大最好用的 Web 调试工具之一
- Nacos学习日记6-基于Springboot框架的Nacos服务注册报错:Application run failed
- 学电脑必知的电脑配置
- 优秀是一种习惯:说一说你身边在世界名校读书的人
- Android逆向第一步之开启root权限
热门文章
- Check $M2_HOME environment variable and mvn script
- [洛谷P3388]【模板】割点(割顶)
- 探讨专线与家用宽带的区别
- asp.net mvc 发布问题
- iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示...
- jQuery:获取浏览器中的分辨率
- python脚本:检测字符串标识符
- 你理解这些Cisco NAT分类和原理吗
- 中国行业应用软件领域恶性循环的原因是什么?【转载】
- MacOS Monterey12.3和Big Sur11.6.5离线安装包