第一章 概論
1. 關(guān)于輕量重量級的解釋
夏昕說:現(xiàn)在的輕量級和重量級的確很難區(qū)分了,沒有一個明確的衡量標(biāo)準(zhǔn),之前有人說,有classloader的算是重量級;也有人說,超過3MB的算是重量級,spring core算是輕量級的,但是加上期于的部件,估計就得列入重量記的范疇了。
林信良說:用了spring并不等于輕量級開發(fā)。重點是您有沒有采納其精神,用了IOC就輕量級了嗎?不見得。什么都來不DI,我看也是很沉重的;如果你在設(shè)計時善用IoC,即使不用spring也是輕量級。不要為了spring而spring。
2. IoC的理解
Don't call me,I will call you!程序不依賴于實現(xiàn),而是依賴與抽象接口。在設(shè)計業(yè)務(wù)類時,我們設(shè)計為它依賴于某抽象接口,具體的需要哪個實現(xiàn)類是由配置文件來幫我們注入的。這就是面向接口編程的思想,當(dāng)業(yè)務(wù)需求發(fā)生變動時,我們只需修改其實現(xiàn)類的具體實現(xiàn),而接口并沒有改變,所以低層業(yè)務(wù)代碼不做任何改動,既增加了代碼的復(fù)用率,也是功能接口變得清晰。Don't call me,you should call my interface!
3. DI 依賴注入的理解
保留抽象接口,讓組件依賴抽象接口,當(dāng)組件要與其他實際的對象發(fā)生依賴關(guān)系時,由抽象接口來注入依賴的實際對象。依賴注入,注入你所依賴的實現(xiàn)類,由spring容器幫你注入適合的實現(xiàn)類,而不是你自己去創(chuàng)建bean實例。有3種基本實現(xiàn)方式:Interface injection、Setter injection與Constructor injection。
4. 應(yīng)用程序中獲取bean
2 <property name="helloWord">
3 <value>Hello yangay!</value>
4 </property>
5 </bean>






這是通過beanFactory管理Bean的方式,BeanFactory負(fù)責(zé)讀取Bean定義文件;管理對象的加載、生成;維護(hù)Bean對象之間的依賴關(guān)系;負(fù)責(zé)Bean的生命周期,對于簡單的應(yīng)用程序來說,使用BeanFactory就已經(jīng)足夠來管理Bean了。BeanFactory接口提供了六個方法管理Bean。
另外還可以通過ApplicationContext來獲取Bean對象:
2 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調(diào)用bean里定義的所有方法
第二章 spring IoC、AOP實例及分析
1. IoC實例一
控制反轉(zhuǎn)用得最多的是為業(yè)務(wù)類注入Bean對象,典型的應(yīng)用是在結(jié)合struts開發(fā)是,為struts的action類來注入springDao,這樣在業(yè)務(wù)層如action類中不再介入spring API,但同時又可以利用spring提供的所有便捷功能。低層實現(xiàn)細(xì)節(jié)發(fā)生的變化,對業(yè)務(wù)層來說是透明的,不但降低了程序的偶合性,而且也提高了DAO對象的重用性。在這個例子中,為了簡單起見,我們只為HelloBean注入了一個字符串,而不是注入實體Bean。但這只體現(xiàn)出了控制反轉(zhuǎn)的特點,對于依賴注入DI并沒有得到明顯的體現(xiàn)。
1)首先編寫一個簡單的JAVABEAN
2 private String helloWord;
3 public String getHelloWord() {
4 return helloWord;
5 }
6 public void setHelloWord(String helloWord) {
7 this.helloWord = helloWord;
8 }
9 }
2 <property name="helloWord">//設(shè)置了bean中setter的名稱
3 <value>Hello yangay!</value>//設(shè)置了將要注入的值
4 </property>
5 </bean>
3)最后編寫一個簡單的示范程序
2
3 public static void main(String[] args) {
4 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
5 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調(diào)用bean里定義的所有方法
6 System.out.println(hello.getHelloWord());
7 }
8 }
--------------------
2. 1. IoC實例二
其實spring IoC的初衷就是降低程序的偶合性,使開發(fā)者面向接口編程,使業(yè)務(wù)層設(shè)計不以來于實現(xiàn),具體依賴與哪個bean是在speing培植文件中來定義的。同樣在這里寫一個示范程序,包括一個接口,兩個實現(xiàn)類,一與業(yè)務(wù)有關(guān)的Business類,Business類依賴的是接口,而不是接口的實現(xiàn),具體需要哪個實現(xiàn)是由spring容器來實現(xiàn)注入的。
1)接口
只聲明了一個保存的方法
2 void svaeToDevice();
3 }
2
3 public void svaeToDevice() {
4 System.out.println("存儲至軟盤

5 }
6 }
2 public class DiskWriter implements IDeviceWriter{
3
4 public void svaeToDevice() {
5 System.out.println("存儲至硬盤

6 }
7 }
4)業(yè)務(wù)類,依賴于抽象的IDviceWriter接口,要 存儲到磁盤還是軟盤是由spring配置文件來決定的
2
3 private IDeviceWriter writer;
4 public void save(){
5 writer.svaeToDevice();
6 }
7
8 public IDeviceWriter getWriter() {
9 return writer;
10 }
11 public void setWriter(IDeviceWriter writer) {
12 this.writer = writer;
13 }
14 }
2 <bean id="diskWriter" class="chapter2.FloppyWriter"/>
3 <bean id="business" class="chapter2.Business">
4 <property name="writer">
5 <ref bean="floppyWriter"/>
6 </property>
7 </bean>
6)測試類
2
3 public static void main(String[] args) {
4 Resource rs = new ClassPathResource("applicationContext.xml");
5 BeanFactory factory = new XmlBeanFactory(rs);
6 Business business = (Business) factory.getBean("business");
7 business.save();
8 }
9 }
現(xiàn)在如果我們想要把數(shù)據(jù)保存到硬盤,而不是軟盤了,我們只需要修改bean的配置文件,讓業(yè)務(wù)類Business依賴于diskWriter既可,Business不做任何的修改。這也是面向接口編程的好處所在。