<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 22:16

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

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

          目的:對比傳統(tǒng)方式和 Spring注入方式創(chuàng)建對象以達(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...");
          ????}
          }
          //測試
          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

          測試結(jié)果:

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

          方式二:Spring注入對象

          ????????????????????????????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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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類型的屬性,生成對應(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測試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();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">3.UserDao接口

          點(diǎn)擊關(guān)注公眾號,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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">測試

          ????????????????????????????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類型的屬性,生成對應(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測試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();????}}測試結(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類型的屬性,生成對應(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測試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();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">測試結(jié)果

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

          總結(jié)

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

          圖一:高度耦合的齒輪組

          而用Spring注入對象猶如圖二的齒輪,利用第三方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)載請附上原文出處鏈接及本聲明。


          微信官宣:一大波新年紅包封面來了!
          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)
          再見,CentOS!正式停服
          Logback 也爆雷了,驚爆了
          炸了!Log4j2 再爆漏洞。。
          勁爆!Java 協(xié)程要來了
          重磅官宣:Redis 對象映射框架來了!!
          推薦一款代碼神器,代碼量至少省一半!
          程序員精通各種技術(shù)體系,45歲求職難!
          重磅!Spring Boot 2.6 正式發(fā)布
          Spring Boot 學(xué)習(xí)筆記,這個(gè)太全了!



          關(guān)注Java技術(shù)棧看更多干貨



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 51
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  中国久久一级片 | 美女第一操逼网站 | 偷拍视频中文字幕资源 | 精品人妻无码一区二区三区四川人 | 亚洲 欧美 另类 综合 偷拍 |