控制反轉(IOC):不需要主動去創造,或者不需要自己去取。而是直接告訴我需要什么,然后你給我放進來.
IoC模式,系統中通過引入實現了IoC模式的IoC容器,即可由IoC容器來管理對象的生命周期、依賴關系等,從而使得應用程序的配置和依賴性規范與實際的應用程序代碼分開。其中一個特點就是通過文本的配置文件進行應用程序組件間相互關系的配置,而不用重新修改并編譯具體的代碼
可以把IoC模式看做是工廠模式的升華,可以把IoC看作是一個大工廠,只不過這個大工廠里要生成的對象都是在XML文件中給出定義的,然后利用Java 的“反射”編程,根據XML中給出的類名生成相應的對象。從實現來看,IoC是把以前在工廠方法里寫死的對象生成代碼,改變為由XML文件來定義,也就是把工廠和對象生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
優缺點編輯
IoC最大的好處是什么?因為把對象生成放在了XML里定義,所以當我們需要換一個實現子類將會變成很簡單(一般這樣的對象都是實現于某種接口的),只要修改XML就可以了,這樣我們甚至可以實現對象的熱插拔(有點像USB接口和SCSI硬盤了)。
IoC最大的缺點是什么?(1)生成一個對象的步驟變復雜了(事實上操作上還是挺簡單的),對于不習慣這種方式的人,會覺得有些別扭和不直觀。(2)對象生成因為是使用反射編程,在效率上有些損耗。但相對于IoC提高的維護性和靈活性來說,這點損耗是微不足道的,除非某對象的生成對效率要求特別高。(3)缺少IDE重構操作的支持,如果在Eclipse要對類改名,那么你還需要去XML文件里手工去改了,這似乎是所有XML方式的缺陷所在。
配置注意點:
- bean必須要有無參的構造函數
- id必須唯一
- 屬性的注入用setter方法注入(不只是spring,一般用反射也是一樣)
- 屬性有特殊字符的時候可以用 <![CDATA] [特殊字符] >
- 屬性如果有引用類型使用 ref="bean的id"
- null的專有標記 <null/>
- 給級聯屬性賦值:<property name="car.maxSpeed" value="2222"/> 注意:這個car要先被初始化才可以給它的屬性賦值
- 也可以用構造器構造:xml里是用<constructor-arg>標簽
- 那么如何區別重載的構造方法,在標簽里加上type屬性
- spring屬性可以是List set map集合
- 可以配置properties屬性值(properties是Hashtable的子類)
- 集合的bean可以拿出來,可以配置、單例的集合bean。需要導入util的命名空間:
<util:list id="cars">
<ref bean="car">
<ref bean="car2">
</util:list>
- 通過p可以命名空間為bean的屬性賦值
<bean id="id1" class="com.xxx.xxx.xxx.object" p:name="aa" p:name2="bb" p:name3="cc">
</bean>
- autowire 可以使用autowire進行自動裝配:
byName根據bean的名字和當前bean的setter風格的屬性名進行裝配,如果沒有則不裝配
byType是根據bean的類型和當前bean的屬性的類型進行裝配,如果同時又1個以上能匹配上的則拋異常
如果用了則必須都要用自動裝配
其實很少使用。 - parent=“bean的名字” 配置這個屬性后可以繼承這個bean的屬性,也可以覆蓋父類的屬性 ,也可加個abstract="true"屬性編程抽象bean,和抽象類的概念一樣,不能被實例化
- 也可以配置讓一個bean依賴于一個bean
depends-on="bean名字"
這個前置的bean會在這個bean之前創建好
- 配置好的bean默認都是單例的,可以使用scope="作用域"。
作用域有:singleton單例的,prototype原型的(容器初始化時不會創建bean實例,而是在每次請求時創建一個新的bean實例),request,session對應域對象 - 我們可以使用<context:property-placeholder location="classpath:xxxx.properties">來導入外部的配置文件,然后我們使用${屬性名}來使用屬性值。這樣可以方便我們bean的管理,易于維護。
我們一般用實現ApplicationContet這個接口的實現類,不用BeanFactory(這個BeanFactory是給spring里自己用的)
ApplicactionContext的主要的實現類:
ClassPathXmlApplicationContext:從類路徑下加載配置文件
FileSystemXmlApplicationContext:從文件系統下加載配置文件
ConfigurableApplicationContext:對ApplicationContext的擴展,主要是增加了兩個方法:refresh,close用來刷新和關閉上下文
WebApplicationContext是專門用來給web應用用的,允許從web的根目錄來完成初始化工作