1.Spring簡介
Spring的根本使命:簡化Java開發(fā)纪挎,為了降低Java開發(fā)的復(fù)雜性猫十,Spring采取了以下四種關(guān)鍵策略:
- 基于POJO的輕量級和最小侵入性變成
- 通過依賴注入和面向接口實現(xiàn)松耦合
- 基于切面和慣例進行聲明式編程
- 通過切面和模板減少樣板式代碼
依賴注入
通過DI對象的依賴關(guān)系將由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各對象的第三方組件在創(chuàng)建對象的時候進行設(shè)定双谆,對象無須自行創(chuàng)建或管理它們的依賴關(guān)系狸捅。
依賴注入方式
- 構(gòu)造器注入
- setter函數(shù)注入
- 注解注入
應(yīng)用上下文
Spring通過應(yīng)用上下文裝載bean的定義并把它們組裝起來偎巢,Spring應(yīng)用上下文全權(quán)負(fù)責(zé)對象的創(chuàng)建和組裝。
- 對基于xml的配置屡限,Spring提供了ClassPathXmlApplicationContext應(yīng)用上下文
- 對基于java的配置,Spring提供了AnnotationConfigApplicationContext應(yīng)用上下文
2.裝配
創(chuàng)建應(yīng)用組件之間協(xié)作的行為稱為裝配炕倘,裝配方式有
- 基于xml的配置
- 基于 java的配置
- 隱式的bean發(fā)現(xiàn)機制和自動裝配
原則: 盡可能地使用自動裝配的機制钧大,顯式配置越少越好
2.1 通過java代碼裝配bean
2.1.1 創(chuàng)建配置類
@Configuration注解表明這個類是一個配置類,該類應(yīng)該包含在應(yīng)用上下文中如何創(chuàng)建bean的細(xì)節(jié)罩旋。
2.1.2 聲明簡單的bean
要在JavaConfig中聲明bean啊央,我們需要編寫一個方法,這個方法會創(chuàng)建所需類型的實例涨醋,然后給這個方法添加@Bean瓜饥。
@Bean注解會告訴Spring這個方法將會返回一個對象,該對象要注冊為Spring應(yīng)用上下文中的bean浴骂,方法體中包含了最終產(chǎn)生bean實例的邏輯乓土。默認(rèn)情況下,bean的ID與帶有@Bean注解的方法名是一樣的溯警。
2.1.3 借助JavaConfig實現(xiàn)注入
通常采用構(gòu)造器和Setter方法將所需要的bean注入進來趣苏。當(dāng)然你也可以使用其他任何方法,只要添加@Bean注解梯轻,并把需要的bean對象注入進來即可食磕。
默認(rèn)情況下,Spring中的bean都是單例的喳挑。
2.2 通過xml裝配bean
2.2.1 創(chuàng)建xml配置規(guī)范
2.2.2 聲明一個簡單的<bean>
<bean id="..." class="..." scope="singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
2.2.3 借助構(gòu)造器注入初始化bean
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<constructor-arg ref="spellChecker"/>
<constructor-arg value="Zara"/>
</bean>
如果你想要向一個對象傳遞一個引用彬伦,你需要使用 標(biāo)簽的 ref 屬性,如果你想要直接傳遞值伊诵,那么你應(yīng)該使用如上所示的 value 屬性单绑。
也可以采用c-命名空間簡化配置。
2.2.3 設(shè)置屬性
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<property name="spellChecker" ref="spellChecker"/>
</bean>
也可以采用p-命名空間簡化配置日戈。
2.3 自動化裝配
Spring從兩個角度來實現(xiàn)自動化裝配:
- 組件掃描:spring會自動發(fā)現(xiàn)上下文中所創(chuàng)建的bean
- 自動裝配:spring自動滿足bean之間的依賴
組件掃描
- @Component:注解在類上面询张,表明該類會作為組件類,并告知spring要為這個類創(chuàng)建bean
- @ComponentScan("backageName"):啟用組件掃描浙炼,注解在配置類上面份氧,spring會自動掃描該類所在的包以及這個包下的所有子包唯袄,查找?guī)в蠤Component注解的類,也可以通過在xml文件中增加<context:componet-scan>元素啟用組件掃描蜗帜。
如果只有@ComponentScan恋拷,而沒有設(shè)置屬性,它會以配置類所在所在的包作為基礎(chǔ)包厅缺,如果想自定義不同的基礎(chǔ)包蔬顾,可以在()中進行定義。如下所示:
@ComponentScan(basePackages={"packageName1","packageName2"})
@ComponentScan還提供了另外一種方法湘捎,將其指定為包中所包含的類或接口
@ComponentScan(basePackageClasses=({className1.class,className2.class}),basePackageClasses所設(shè)置的數(shù)組中包含了類诀豁,這些類所在的包將會作為組件掃描的基礎(chǔ)包。
自動裝配
@Autowired注解窥妇,可以作用在構(gòu)造器上舷胜,Setter方法,普通方法上活翩。