Spring(一):IOC如何推導和理解
IOC的推導
1.1、模擬一個正常查詢信息的業(yè)務流程:
①mapper層:因為沒有連接數(shù)據(jù)庫,這里我們寫一個mapper的實現(xiàn)類來模擬數(shù)據(jù)的查詢
public interface PerMapper { void getPerInfo(); } public class StudentMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一個學生"); } }
②service層:service的作用是查詢人的信息
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í)行結果如下:
image
1.2、多個種類的查詢
①mapper,增加老師實現(xiàn)類
public class TeacherMapperImpl implements PerMapper { @Override public void getPerInfo() { System.out.println("我是一個老師"); } }
②這時候我們同時查詢教師和學生的信息該怎么做呢?
public class PersonServiceImpl implements PersonService { private PerMapper student = new StudentMapperImpl(); private PerMapper teacher = new TeacherMapperImpl(); @Override public void getPersonInfo() { student.getPerInfo(); teacher.getPerInfo(); } }
③執(zhí)行結果:
image
④如果需求再次變更呢?只需要教師的信息怎么做呢? 毋庸置疑:兩種做法, 一種是直接更改PersonServiceImpl的getPersonInfo()
@Override public void getPersonInfo() { // student.getPerInfo(); teacher.getPerInfo(); }
第二種是擴展service層的接口,把老師和學生分別提供接口來查詢:
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(); } }
⑤看起來好像沒啥問題是吧?那假如有一百種人呢?需要改來改去人都會瘋掉的。這種做法肯定不合理的!
1.3、優(yōu)化查詢方式
①聰明的孩子可以想到將查詢的對象剝離出來:添加 set() 方法,對接口不實現(xiàn),只進行預留的工作。
public class PersonServiceImpl implements PersonService { private PerMapper per; public void setPer(PerMapper per) { this.per = per; } @Override public void getPersonInfo() { per.getPerInfo(); } }
②controller層實現(xiàn)方式:
public class IOCTest { public static void main(String[] args) { PersonServiceImpl service = new PersonServiceImpl(); //學生 service.setPer(new StudentMapperImpl()); service.getPersonInfo(); //老師 service.setPer(new TeacherMapperImpl()); service.getPersonInfo(); } }
③總結:這種方式就是把主動權交給了調用者 ,程序不用去管怎么創(chuàng)建,怎么實現(xiàn)了 .,它只負責提供一個接口 。
我們不再去管理對象的創(chuàng)建了 , 更多的去關注業(yè)務的實現(xiàn) ,耦合性大大降低 ,這也就是IOC的原型 !
1.4、IOC本質
控制反轉是一種通過描述(XML或注解)并通過第三方去生產或獲取特定對象的方式。在Spring中實現(xiàn)控制反轉的是IOC容器,其實現(xiàn)方法是依賴注入(Dependency Injection,DI)。
相關文章
SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題
這篇文章主要介紹了SpringCloud引入feign失敗或找不到@EnableFeignClients注解問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java中由substring方法引發(fā)的內存泄漏詳解
這篇文章主要介紹了Java中由substring方法引發(fā)的內存泄漏詳解,涉及substring方法引發(fā)的內存泄漏簡介,substring的作用和實現(xiàn)原理等相關內容,具有一定借鑒價值,需要的朋友可以參考下2017-12-12Java String index out of range:100錯誤解決方案詳解
這篇文章主要介紹了Java String index out of range:100錯誤解決方案詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細教程
這篇文章主要介紹了Win10 Java jdk14.0.2安裝及環(huán)境變量配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08