個人學習方式是,學習一個東西,得有一個總體的框架,否則,我會受不了老是模仿着demo程序而不知道這個黑箱子裏頭究竟是什麼鬼的狀態,這樣簡直讓人抓狂。若是,你也像我這樣,建議多看一些博客,有個整體的概覽。這篇文章,講解我在初學spring時,哪些令我抓狂的概念。spring
這就是這裏要圍繞講解的兩個內容。session
爲何要理解依賴。剛接觸spring,咱們最開始接觸的術語,應該是 「控制反轉ioc(inversion of control」);app
具體怎麼理解控制反轉,我以爲即便解釋也很難理解。有些書裏也說了,某某人提出了一個更容易理解的概念。ioc=ID(injection dependency )依賴注入。意思是說,一個類中,依賴於其餘類的「關係」,採用注入的形式,而不是採用 在「」類中本身編碼實現「」的形式 來完成依賴關係。框架
依賴注入:組件之間的依賴關係由容器在運行期決定 ,由容器動態的將某種依賴關係注入到組件之中 。 學習
依賴:依賴是一種 域對象 間的關係。與之類似的概念有 「關聯」,"聚合」等。深刻學習,能夠去看 《UML統一建模語言指南》。這裏舉一些例子來說解。編碼
//這裏不是依賴 public class Cat{ Foot foot; Head head; Body body; //組合 } public class ClassOne{ List<Student> studentList; //聚合 String className; } public class Order{ String orderId; Product product; Int num; Customer customer; //關聯 }
好吧,這幾個跟依賴沒有關係。spa
public class StudentService{ StudentDao dao = new StudentDaoImpl(); public Student getStudentById(int id){ dao.getStudentById(id); //依賴 } }
這是依賴的一種,spring中的依賴不徹底等同於UML中的依賴,它將泛化的關係也當作依賴關係。code
主要想要表達的是:對象
你可能聽到這麼一句話,spring就是一個大的工廠。那麼,代碼層面上,是怎麼體現工廠的特性的呢。接口
首先來回顧下,咱們之前用過的工廠。
session=SessionFactory.open(); someObj=(AType)applicationContext.getBean("beanName"); object=beanFactory.getBean(object.Class); public class MyFactory{ public person createPerson(){ person=new Person(); returne person; } } persn=(new MyFactory()).createPerson();
無非就是一個工廠的類,加一個工廠方法(靜態或非靜態,有參數或無參,但必定都有返回值);
而常說的spring中的ioc容器,也就是一個工廠,一個容器。
說是工廠,因此接口必須定義成:
public interface BeanFactory{ <T> getBean(args...) //這就是我要的工廠方法 }
而說是容器,是由於一個工廠,必須有原料啊。但這個接口並無裝原料的地方啊。
而咱們經常使用的類是ClassPathXMLAppliactionContext ,這個是這個工廠接口的某一級子類。
public class ClassPathXMLAppliactionContext{ Map BeanMap; //一些實體 Map BeanDefination; //實體的依賴關係的描述信息 <T> getBean(args...) //採用上述兩種材料來組裝出目標的 Bean; }
然而,這個容器中,不只包含了生產實體的原材料,還包含一些環境,因此名稱中叫Context也是有環境的意義在裏面的吧。