<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring是包含眾多工具的IoC容器,控制反轉即IoC,它有兩個核心的功能:
①將物件(Bean)儲存在容器(Spring)
②將物件(Bean)從容器(Spring)中取出來
【擴充套件:將物件存放到容器中的好處】
將物件儲存在 IoC 容器相當於將以後可能⽤的所有工具製作好都放到倉庫中,需要的時候直接取就行了,用完再把它放回到倉庫。而new 物件的方式相當於,每次需要工具了,才現做,用完就扔掉了也不會儲存,下次再用的時候還得重新做,這就是 IoC 容器和普通程式開發的區別
IOC 或 依賴注入把應用的程式碼量降到最低
它使應用容易測試,單元測試不再需要單例和JNDI查詢機制
最小的代價和最小的侵入性使鬆散耦合得以實現
IOC容器支援載入服務時的餓漢式初始化和懶載入
將建立物件的控制權交給Spring的IoC,以前需要程式設計師自己控制物件建立,現在交給Spring的IoC建立,如果需要使用需要通過DI(依賴注入)@Autowired自動注入
解耦,由容器去維護具體的物件,降低耦合度
【擴充套件:什麼是解耦,程式碼範例】
解耦指的是解決了程式碼的耦合性,耦合性也可以換⼀種叫法叫程式相關性。這就好比我們打造⼀輛完整的汽車,如果所有的配件都是自己造,那麼當客戶需求發生改變的時候,比如輪胎的尺寸不再是原來的尺寸了,那我們要自己動手來改了,但如果我們是把輪胎外包出去,那麼即使是輪胎的尺寸發生變變了,我們只需要向代理工廠下訂單就行了,我們自身身是不需要出力的
在傳統的程式碼中物件建立順序是:Car -> Framework -> Bottom -> Tire
改進之後解耦的程式碼的物件建立順序是:Tire -> Bottom -> Framework -> Car
public class IocCarExample { public static void main(String[] args) { Tire tire = new Tire(20); Bottom bottom = new Bottom(tire); Framework framework = new Framework(bottom); Car car = new Car(framework); car.run(); } //車類,把建立⼦類的⽅式,改為注⼊傳遞的⽅式 static class Car { private Framework framework; public Car(Framework framework) { this.framework = framework; } public void run() { framework.init(); } } //車身類 static class Framework { private Bottom bottom; public Framework(Bottom bottom) { this.bottom = bottom; } public void init() { bottom.init(); } }
IoC:控制反轉,由主動new產生物件(耦合過高)轉換成從外部提供物件,就是將物件的建立控制權從程式轉移到了外部
DI:依賴注入,就是在程式執行期間,自動的將一個物件從Spring拿出來給當前類使用
區別:
IoC 是“目標”也是⼀種思想,而目標和思想只是⼀種指導原則,而 DI 就是具體的實現
例如:比如說我今天心情比較好,吃⼀頓好的犒勞犒勞自己,那麼“吃⼀頓好的”是思想和目標(是 IoC),但最後我是吃海底撈,這就是具體的實現,就是 DI
1. 簡單工廠:通過一個方法傳入一個標識,生產對應物件
工廠模式案例:
public static void main(String[] arge){ // 呼叫工廠方法,根據傳入引數,返回一個物件 BaseService userService = Factory.getBean("user"); } class Factory{ public static BaseService getBean(String beanName){ if("user".equals(beanName)){ return = new UserServiceImpl(); } if("role".equals(beanName)){ return = new RoleServiceImpl(); } } }
2.反射:反射就是在工廠模式getBean()方法中通過反射的方式來建立Bean
class Factory { public static Fruit getInstance(String ClassName) { Fruit f=null; try { f=(Fruit)Class.forName(ClassName).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } }
【擴充套件:反射是什麼,反射的實現原理】
反射機制是在執行的狀態,對於任何一個類,都能知道所有屬性和方法,對於任何一個物件都能呼叫任意方法屬性,所以反射就是將Java類的各種成分對映成一個個物件
①通過Class類的靜態方法:forName(String className)(常用)獲取Class物件
try { Class stuClass3 = Class.forName("fanshe.Student");//注意此字串必須是真實路徑,就是帶包名的類路徑,包名.類名 System.out.println(stuClass3 == stuClass2);//判斷三種方式是否獲取的是同一個Class物件 } catch (ClassNotFoundException e) { e.printStackTrace(); }
②通過反射獲取構造方法並使用:
public class Student { //---------------構造方法------------------- //(預設的構造方法) Student(String str){ System.out.println("(預設)的構造方法 s = " + str); } //無參構造方法 public Student(){ System.out.println("呼叫了公有、無參構造方法執行了。。。"); } //有一個引數的構造方法 public Student(char name){ System.out.println("姓名:" + name); } //有多個引數的構造方法 public Student(String name ,int age){ System.out.println("姓名:"+name+"年齡:"+ age);//這的執行效率有問題,以後解決。 } //受保護的構造方法 protected Student(boolean n){ System.out.println("受保護的構造方法 n = " + n); } //私有構造方法 private Student(int age){ System.out.println("私有的構造方法 年齡:"+ age); } }
Spring 的 IoC 設計支援以下功能:
1.依賴注入
2.依賴檢查
3.自動裝配
4.支援集合
5.指定初始化方法和銷燬方法
6.支援回撥某些方法(但是需要實現 Spring 介面,略有侵入)
其中,最重要的就是依賴注入,從 XML 的設定上說,即 ref 標籤。對應 Spring RuntimeBeanReference 物件。
對於 IoC 來說,最重要的就是容器。容器管理著 Bean 的生命週期,控制著 Bean 的依賴注入
【擴充套件:解釋Bean週期】下篇部落格詳細介紹
首先建立Spring上下文的時候,會使用BeanFactory和ApplicationContext兩種方法
//先得到Spring上下文 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//組態檔對應
// 先得到 spring 獲取 bean 的物件 BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
共同點:BeanFactory和ApplicationContext是Spring的兩大核心介面,都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子介面
區別:
①繼承關係和功能:ApplicationContext是BeanFactory的子類,BeanFactory只是提供了基礎操作Bean的方法,ApplicationContext除了繼承了 BeanFactory 的所有功能之外,它還擁有獨特的特性,還新增了對國際化⽀持,資源存取⽀持等
②效能:ApplicationContext 是⼀次性載入並初始化所有的 Bean 物件,而 BeanFactory是需要那個才去載入那個,因此更加輕量
FileSystemXmlApplicationContext :此容器從一個XML檔案中載入beans的定義,XML Bean 組態檔的全路徑名必須提供給它的建構函式
ClassPathXmlApplicationContext:此容器也從一個XML檔案中載入beans的定義,這裡,你需要正確設定classpath因為這個容器將在classpath裡找bean設定
WebXmlApplicationContext:此容器載入一個XML檔案,此檔案定義了一個WEB應用的所有bean
依賴注入是時下最流行的IoC實現方式,依賴注入分為介面注入,Setter方法注入,和構造器注入,三種方式。其中介面注入由於在靈活性和易用性比較差,現在從Spring4開始已被廢棄
1.構造器注入
將被依賴物件通過建構函式的引數注入給依賴物件,並且在初始化物件的時候注入。優點:物件初始化完成後便可獲得可使用的物件。
缺點:當需要注入的物件很多時,構造器參數列將會很長;不夠靈活。若有多種注入方式,每種方式只需注入指定幾個依賴,那麼就需要提供多個過載的建構函式,麻煩
2.setter方法注入
lOC Service Provider通過呼叫成員變數提供的setter函數將被依賴物件注入給依賴類優點:靈活,可以選擇性地注入需要的物件
缺點:依賴物件初始化完成後由於尚未注入被依賴物件,因此還不能使用
3.介面注入
依賴類必須要實現指定的介面,然後實現該介面中的一個函數,該函數就是用於依賴注入。該函數的引數就是要注入的物件
優點:介面注入中,介面的名字、函數的名字都不重要,只要保證函數的引數是要注入的物件型別即可。缺點:侵入行太強,不建議使用
【擴充套件:什麼是侵入性?】
如果類A要使用月別人提供的一個功能,若為了使用這功能,需要在自己的類中增加額外的程式碼,這就是侵入性
區別:
依賴注入的基本原則:
應用元件不應該負責查詢資源或者其他依賴的共同作業物件。設定物件的工作應該由IoC容器負責,“查詢資源”的邏輯應該從應用元件的程式碼中抽取出來,交給IoC容器負責。容器全權負責元件的裝配,它會把符合依賴關係的物件通過屬性(JavaBean中的setter)或者是構造器傳遞給需要的物件
優勢:
①查詢定位元運算與應用程式碼完全無關
②不依賴於容器的API,可以很容易地在任何容器以外使用應用物件
③不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器
以上就是深入瞭解Spring控制反轉IOC原理的詳細內容,更多關於Spring控制反轉IOC的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45