上一篇: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?它到底解决了什么问题?相关推荐

  1. 百度面试官:来聊聊Spring吧

    文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...

  2. 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

    华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...

  3. 面试官角度看应聘:问题到底出在哪?(下)

    作者简介:堂主,2006 年开始沉迷前端领域.工作历经淘宝前端开发团队.蘑菇街前端团队,现为政采云前端团队(ZooTeam)负责人,好烟不好酒,半个茶人. 本篇是<面试官角度看应聘:问题到底出在 ...

  4. 【232期】面试官:如何保护 Spring Boot 配置文件敏感信息?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  5. 面试官:兄弟,说说Java到底是值传递还是引用传递

    二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...

  6. 面试官:工作中遇到难题怎么解决的?看似送分题实则”送命”

    "金九银十"跳槽季,不少职场的新人,在面对这个问题是无从下手,甚至很多职场老人也会措手不及,尴尬的说:"工作中没有什么难题吧,基本上都可以解决."如果我们这样回 ...

  7. 面试官欺负人:new Object()到底占用几个字节?

    前言 我们来分析一下堆内布局以及Java对象在内存中的布局吧. 对象的指向 先来看一段代码: package com.zwx.jvm;public class HeapMemory {private ...

  8. 程序员面试怎么回答面试官:你对Spring的理解?

    spring呢,是pivotal公司维护的一系列开源工具的总称,最为人所知的是spring mvc,事实上,他们都是基于spring framework,并且再其上继续增强,为某一方面服务的java组 ...

  9. 面试官问我:spring、springboot、springcloud的区别,我笑了

    好吧,可能某些项目还在使用dubbo,但是你也一定听过Spring Cloud.至于Spring和Spring Boot,对于现在的Java开发,它们的地位简直可以说是不可或缺了.如果你的新项目在使用 ...

  10. 吊打面试官系列之--吃透Spring ioc 和 aop (中)

    目录 Spring SpringBean的五个作用域 SpringBean的生命周期 创建过程 销毁过程 AOP的介绍和使用 AOP的介绍 AOP的三种织入方式 操作讲解 AOP的主要名词概念 Adv ...

最新文章

  1. 【微信小程序企业级开发教程】界面刷新获取新更新数据
  2. python将数据存入mysql数据库中_python3 两种方法将数据存入mysql数据库
  3. 初入c++(七)运算符的重载+、-、*、/、[]、自加++的重载
  4. mybatis中存储过程的调用
  5. 《TensorFlow技术解析与实战》——1.2 什么是深度学习
  6. Qcom平台添加 Camera 驱动(msm8953)
  7. react+ts+gulpjs将插件转成umd.js文件
  8. redis通过key模糊搜索_Redis中关于Key的模糊查找
  9. Unity:编辑器Editor常用命令
  10. 免费的crm系统部署在自己的服务器,crm系统本地部署与云端部署的区别
  11. asp毕业设计——基于asp+access的学生成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统
  12. Oracle中的NVL()函数的用法
  13. CSDN文章摘要自定义修改
  14. 嵌入式Linux中间件,高可用性(HA)和嵌入式管理中间件:Enea Element详解
  15. TradingView - K线 使用详解
  16. Fiddler抓包工具是最强大最好用的 Web 调试工具之一
  17. Nacos学习日记6-基于Springboot框架的Nacos服务注册报错:Application run failed
  18. 学电脑必知的电脑配置
  19. 优秀是一种习惯:说一说你身边在世界名校读书的人
  20. Android逆向第一步之开启root权限

热门文章

  1. Check $M2_HOME environment variable and mvn script
  2. [洛谷P3388]【模板】割点(割顶)
  3. 探讨专线与家用宽带的区别
  4. asp.net mvc 发布问题
  5. iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示...
  6. jQuery:获取浏览器中的分辨率
  7. python脚本:检测字符串标识符
  8. 你理解这些Cisco NAT分类和原理吗
  9. 中国行业应用软件领域恶性循环的原因是什么?【转载】
  10. MacOS Monterey12.3和Big Sur11.6.5离线安装包