淺談Spring中IOC的理解和認(rèn)知
IOC的推導(dǎo)
1.1、模擬一個(gè)正常查詢信息的業(yè)務(wù)流程:
①mapper層:因?yàn)闆](méi)有連接數(shù)據(jù)庫(kù),這里我們寫一個(gè)mapper的實(shí)現(xiàn)類來(lái)模擬數(shù)據(jù)的查詢
public interface PerMapper { void getPerInfo(); }
public class StudentMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一個(gè)學(xué)生"); } }
②service層:service的作用是查詢?nèi)说男畔?/p>
public interface PersonService { void getPersonInfo(); }
public class PersonServiceImpl implements PersonService { private PerMapper studentMapper = new StudentMapperImpl(); @Override public void getPersonInfo() { studentMapper.getPerInfo(); } }
③contorller層
import service.PersonService; import service.impl.PersonServiceImpl; public class IOCTest { public static void main(String[] args) { PersonService service = new PersonServiceImpl(); service.getStudentInfo(); } }
④執(zhí)行結(jié)果如下:
1.2、多個(gè)種類的查詢
①mapper,增加老師實(shí)現(xiàn)類
public class TeacherMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一個(gè)老師"); } }
②這時(shí)候我們同時(shí)查詢教師和學(xué)生的信息該怎么做呢?
public class PersonServiceImpl implements PersonService { private PerMapper student = new StudentMapperImpl(); private PerMapper teacher = new TeacherMapperImpl(); @Override public void getPersonInfo() { student.getPerInfo(); teacher.getPerInfo(); } }
③執(zhí)行結(jié)果:
④如果需求再次變更呢?只需要教師的信息怎么做呢?
毋庸置疑:兩種做法,
一種是直接更改PersonServiceImpl的getPersonInfo()
@Override public void getPersonInfo() { // student.getPerInfo(); teacher.getPerInfo(); }
第二種是擴(kuò)展service層的接口,把老師和學(xué)生分別提供接口來(lái)查詢:
public interface PersonService { void getPersonInfo(); void getPersonInfo1(); }
public class PersonServiceImpl implements PersonService { private PerMapper student = new StudentMapperImpl(); private PerMapper teacher = new TeacherMapperImpl(); @Override public void getPersonInfo() { teacher.getPerInfo(); } @Override public void getPersonInfo1() { student.getPerInfo(); } }
⑤看起來(lái)好像沒(méi)啥問(wèn)題是吧?那假如有一百種人呢?需要改來(lái)改去人都會(huì)瘋掉的。這種做法肯定不合理的!
1.3、優(yōu)化查詢方式
①聰明的孩子可以想到將查詢的對(duì)象剝離出來(lái):添加 set() 方法,對(duì)接口不實(shí)現(xiàn),只進(jìn)行預(yù)留的工作。
public class PersonServiceImpl implements PersonService { private PerMapper per; public void setPer(PerMapper per) { this.per = per; } @Override public void getPersonInfo() { per.getPerInfo(); } }
②controller層實(shí)現(xiàn)方式:
public class IOCTest { public static void main(String[] args) { PersonServiceImpl service = new PersonServiceImpl(); //學(xué)生 service.setPer(new StudentMapperImpl()); service.getPersonInfo(); //老師 service.setPer(new TeacherMapperImpl()); service.getPersonInfo(); } }
③總結(jié):這種方式就是把主動(dòng)權(quán)交給了調(diào)用者 ,程序不用去管怎么創(chuàng)建,怎么實(shí)現(xiàn)了 .,它只負(fù)責(zé)提供一個(gè)接口 。
我們不再去管理對(duì)象的創(chuàng)建了 , 更多的去關(guān)注業(yè)務(wù)的實(shí)現(xiàn) ,耦合性大大降低 ,這也就是IOC的原型 !
1.4、IOC本質(zhì)
控制反轉(zhuǎn)是一種通過(guò)描述(XML或注解)并通過(guò)第三方去生產(chǎn)或獲取特定對(duì)象的方式。在Spring中實(shí)現(xiàn)控制反轉(zhuǎn)的是IOC容器,其實(shí)現(xiàn)方法是依賴注入(Dependency Injection,DI)。
以上就是關(guān)于Spring之IOC的理解和認(rèn)知的詳細(xì)內(nèi)容,更多關(guān)于Spring之IOC的理解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Java提示正在嘗試分配更低的訪問(wèn)權(quán)限問(wèn)題
在本篇文章里小編給大家整理的是關(guān)于解決Java提示正在嘗試分配更低的訪問(wèn)權(quán)限問(wèn)題的相關(guān)方法內(nèi)容,有需要的朋友們跟著參考學(xué)習(xí)下。2019-07-07java在linux系統(tǒng)下開機(jī)啟動(dòng)無(wú)法使用sudo命令的原因及解決辦法
每次開機(jī)自動(dòng)啟動(dòng)的java進(jìn)程,頁(yè)面上的關(guān)機(jī)按鈕都無(wú)法實(shí)現(xiàn)關(guān)機(jī)功能,但是此時(shí)如果以chb賬號(hào)通過(guò)ssh登錄該服務(wù)器,手動(dòng)殺掉tomcat進(jìn)程,然后再重新啟動(dòng)tomcat,頁(yè)面上的關(guān)機(jī)按鈕就有效了2013-08-08Spring boot動(dòng)態(tài)修改日志級(jí)別的方法
我們經(jīng)常會(huì)遇到業(yè)務(wù)想看debug日志的問(wèn)題,但是debug日志頻繁打印會(huì)對(duì)日志查看有影響,且日志多對(duì)系統(tǒng)也會(huì)有一定的壓力,因此,如果可以在需要的時(shí)候動(dòng)態(tài)臨時(shí)調(diào)整下日志的級(jí)別則是比較完美的,spring boot已經(jīng)支持這種功能,需要的朋友可以參考下2022-12-12Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能
這篇文章主要介紹了Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02java異常處理執(zhí)行順序詳解try catch finally
try catch語(yǔ)句是java語(yǔ)言用于捕獲異常并進(jìn)行處理的標(biāo)準(zhǔn)方式,對(duì)于try catch及try catch finally執(zhí)行順序必須有深入的了解2021-10-10Java Springboot 重要知識(shí)點(diǎn)整理匯總
Spring Boot作為微服務(wù)中最好的Java框架,本文主要為大家整理匯總了七個(gè)Spring Boot的重要知識(shí)點(diǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11Java使用UTF-8或GBK編碼后還是亂碼問(wèn)題的解決辦法
在java中處理字符時(shí),經(jīng)常會(huì)發(fā)生亂碼,下面這篇文章主要給大家介紹了關(guān)于Java使用UTF-8或GBK編碼后還是亂碼問(wèn)題的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05