Spring官網方便查看源代碼
http://spring.io/
http://projects.spring.io/spring-framework/
Keys:Spring IOC AOP Bean 註釋和配置輕量級 大小和開銷小
Abstract:
IoC控制反轉-鬆耦合。
AOP面向切面-可以分離應用的業務邏輯和系統級服務進行內聚性的開發。
包含並管理應用對象的配置和生命週期,這個意義上是一種容器。
將簡單組件配置組合成爲複雜的內容,這個意義上是一種框架。
框架就是制定一套規範或者規則,大家在該規範或者規則(思想)下工作。
接口和麪向接口編程
用於溝通的中介物的抽象化。
實體把自己提供給外界的一種抽象化說明,用以由內部操作分離出外部溝通方法,使其能被修改內部而不影響外界其他實體與其交互的方法。
結構設計中,分清層次及調用關係,每層只向外(上層)提供一組功能接口,各層間僅依賴接口而非實現類。
接口實現的變動不影響各層間的調用。
IOC
OC控制反轉
控制權的轉移,應用程序本身不負責依賴對象的創建和維護,而是由外部容器負責創建和維護。
DI依賴注入是一種實現方式。
創建對象並且組裝對象之間的關係。
獲得依賴對象的過程被反轉了,所以更合適的名字叫做依賴注入Dependency Injection。
Bean
Xml文件,版本編碼xsi地址
<bean id=”” class=””></bean>
或者註釋
兩個基礎包org.springframework.beans和org.springframework.context
BeanFactory提供配置結構和基本功能,加載並初始化Bean
ApplicationContext保存了Bean對象並在Spring中被廣泛使用
設值注入
<property name=” injectionDAO” ref=” injectionDAO”/>
<bean id=” injectionDAO” class=””></bean>
在類裏private 接口 利用set方法注入。其中類中private 接口 變量名,變量名應該和bean中的property的name相同,ref與注入的bean的id相同。(這裏的關係類似於IA a = new A();IA是接口,a是變量名也是property的name,new就是注入的過程即通過ref鏈接另一個bean。)
構造注入
<constructor-arg name=”injectionDAO” ref=”injectionDAO”
<bean id=” injectionDAO” class=””></bean>
在類裏private 接口 利用構造器注入。
注意名稱的匹配。
Bean配置項
Id Class
Scope作用域singleton prototype request session global-session
Constructor-arguments Property Autowiring-mode Lazy-initialization-mode
Initialization/destruction-method
Bean的生命週期:
定義 <bean/>
初始化 實現InitializingBean接口覆蓋afterProperiesSet方法 自動調用該方法
配置init-method屬性編寫init()方法實體
使用
銷燬 實現DisposableBean接口覆蓋destroy方法 調用destroy()方法
配置destroy-method 編寫cleanup()方法
配置全局默認初始化,銷燬方法。Default-init/destroy-method = “init/destroy”(在<beans></beans中)
Bean的自動裝配(Autowiring)
No byname bytype Constructor在spring beans裏設置屬性 defaultauto
Aware接口
Spring中提供了一些以Aware結尾的接口,實現了Aware接口的Bean在被初始化之後可以獲取相應資源。通過Aware接口可以對Spring相應資源進行操作(慎用)爲對Spring進行簡單的擴展提供了方便的入口。具體Aware接口看spring-api。
Resources接口
針對於資源文件的統一接口,以resources結尾。通過ResourceLoader接口加載。
Bean管理的註釋實現
Classpath掃描與組件管理
Spring3.0開始可以使用java註解定義bean,@Configuration,@Bean,@Import,@DependsOn
其中@ Component是一個通用註解可以用於任何bean。可以使用過濾器進行掃描bean。
類的自動檢測於註冊Bean
<context:annotation-config/>(<context:component-scan base-package=””scope-resolver=””>)
@Component,
@Repository(DAO類),
@Service(Service類),
@Controller(Controller類),
@Required,@Autowired,@Qualifier,@Resource
@Autowired是根據類型進行自動裝配的,如果需要按名稱進行裝配,則需要配合@Qualifier使用
可以註釋@Scope確定作用域(singleton,prototype等)
Scoped-proxy屬性指定代理?
單元測試
junit-*.jar,創建UnitTestBase類,完成對Spring配置文件的加載銷燬。所有的單元測試類都繼承自UTB,通過他的getBean方法獲取想要得到的對象。子類(具體指向單元測試的類)加註解:@RunWith(BlockJUnit4ClassRunner.class)單元測試方法加註解:@Test。右鍵選擇要執行的單元測試方法執行或者指向一個類的全部單元測試方法。
Question
Spring對象在什麼時候被創建
通常來說在載入配置文件的時候就被創建了,但是如果bean的屬性設置有lazy-init=”true”的話就會在調用getBean()方法的時候調用(手動或者封裝在內部)。