<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:為什么要用 Spring?它到底解決了什么問題?

          共 1033字,需瀏覽 3分鐘

           ·

          2022-01-09 12:01

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          為什么要用 Spring?它到底解決了什么問題?

          目的:對(duì)比傳統(tǒng)方式和 Spring注入方式創(chuàng)建對(duì)象以達(dá)到解耦的目的,以Service層調(diào)用 Dao層為例。

          方式一:傳統(tǒng)方式

          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 :接口中只有一個(gè)抽象方法
          ?*/
          public?interface?UserDao?{
          ????void?query();
          }

          3.UserDao接口的實(shí)現(xiàn)類

          /**
          ?*?@description :接口的實(shí)現(xiàn)類,重寫 query方法
          ?*/
          public?class?UserDaoImpl?implements?UserDao{
          ????@Override
          ????public?void?query()?{
          ????????System.out.println("dao?query...");
          ????}
          }
          //測(cè)試
          public?class?test?{
          ????@Test
          ????public?void?test1(){
          ????????UserService?service?=?new?UserService();
          ????????service.add();
          ????}
          }

          Spring Boot 基礎(chǔ)就不介紹了,推薦下這個(gè)實(shí)戰(zhàn)教程:https://github.com/javastacks/spring-boot-best-practice

          測(cè)試結(jié)果:

          結(jié)論一:由以上過程可以看出,在UserService類中直接調(diào)用實(shí)現(xiàn)類的query方法,一旦實(shí)現(xiàn)類出問題,UserService立即報(bào)錯(cuò),具有高度的耦合性

          方式二:Spring注入對(duì)象

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">1.xml文件配置bean

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">"1.0"?encoding="UTF-8"?>
          "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">

          ????"userService"?class="Service.UserService">
          ????????
          ????????"dao"?ref="Dao">
          ????

          ????"Dao"?class="Dao.UserDaoImpl">

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">2.Service層

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">import?Dao.UserDao;
          /**
          ?*?@author :Prannt
          ?*?@description :
          ?*?@program?:?Demo01
          ?*/
          public?class?UserService?{
          ????public?void?add(){
          ????????System.out.println("service?add......");
          ????????dao.update();
          ????}

          ????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法
          ????private?UserDao?dao;

          ????public?void?setDao(UserDao?dao)?{
          ????????this.dao?=?dao;
          ????}
          }

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">3.UserDao接口

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">public?interface?UserDao?{
          ????void?update();
          }

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">4.接口的實(shí)現(xiàn)類

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">public?class?UserDaoImpl?implements?UserDao{
          ????@Override
          ????public?void?update()?{
          ????????System.out.println("Dao?update......");
          ????}
          }

          推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">測(cè)試

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">import?Service.UserService;
          import?org.junit.Test;
          import?org.springframework.context.ApplicationContext;
          import?org.springframework.context.support.ClassPathXmlApplicationContext;

          public?class?TestBean?{
          ????@Test
          ????public?void?testBean(){
          ????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");
          ????????UserService?userService?=?context.getBean("userService",UserService.class);
          ????????userService.add();
          ????}
          }

          ????????????????????????????2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println('service?add......');????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對(duì)應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println('Dao?update......');????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測(cè)試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext('bean2.xml');????????UserService?userService?=?context.getBean('userService',UserService.class);????????userService.add();????}}測(cè)試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">測(cè)試結(jié)果

          結(jié)論二:觀察以上過程,在UserService類中,沒有直接new實(shí)現(xiàn)類,而是通過將Dao注入外部配置文件中的方式,使用“第三方文件”來達(dá)到解耦的目的。

          總結(jié)

          第一種傳統(tǒng)方式創(chuàng)建對(duì)象,就像圖一中的齒輪組。如果有一個(gè)齒輪出了問題,就可能會(huì)影響到整個(gè)齒輪組的正常運(yùn)轉(zhuǎn)。

          圖一:高度耦合的齒輪組

          而用Spring注入對(duì)象猶如圖二的齒輪,利用第三方xml文件使任意兩個(gè)齒輪之間無必然聯(lián)系,B齒輪壞了也影響不到A、C、D齒輪。齒輪組相互之間的依賴關(guān)系降到最低。

          圖二:解耦后的齒輪組

          原文鏈接:https://blog.csdn.net/qq_38050259/article/details/113414419

          版權(quán)聲明:本文為CSDN博主「Prannt」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

          1、致歉!抖音Semi Design承認(rèn)參考阿里Ant Design

          2、對(duì)比7種分布式事務(wù)方案,還是偏愛阿里開源的Seata,真香!

          3、Redis存儲(chǔ)結(jié)構(gòu)體信息,選hash還是string?

          4、掃盲 docker 常用命令

          5、最全分布式Session解決方案

          6、21 款 yyds 的 IDEA插件

          7、真香!用 IDEA 神器看源碼,效率真高!

          點(diǎn)分享

          點(diǎn)收藏

          點(diǎn)點(diǎn)贊

          點(diǎn)在看



          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美双飞在线 | 国产资源av | 肏屄内射视频 | 8av在线观看 | 大陆操屁屁视频在线观看 |