第一章 概論
1. 關于輕量重量級的解釋
夏昕說:現在的輕量級和重量級的確很難區分了,沒有一個明確的衡量標準,之前有人說,有classloader的算是重量級;也有人說,超過3MB的算是重量級,spring core算是輕量級的,但是加上期于的部件,估計就得列入重量記的范疇了。
林信良說:用了spring并不等于輕量級開發。重點是您有沒有采納其精神,用了IOC就輕量級了嗎?不見得。什么都來不DI,我看也是很沉重的;如果你在設計時善用IoC,即使不用spring也是輕量級。不要為了spring而spring。
2. IoC的理解
Don't call me,I will call you!程序不依賴于實現,而是依賴與抽象接口。在設計業務類時,我們設計為它依賴于某抽象接口,具體的需要哪個實現類是由配置文件來幫我們注入的。這就是面向接口編程的思想,當業務需求發生變動時,我們只需修改其實現類的具體實現,而接口并沒有改變,所以低層業務代碼不做任何改動,既增加了代碼的復用率,也是功能接口變得清晰。Don't call me,you should call my interface!
3. DI 依賴注入的理解
保留抽象接口,讓組件依賴抽象接口,當組件要與其他實際的對象發生依賴關系時,由抽象接口來注入依賴的實際對象。依賴注入,注入你所依賴的實現類,由spring容器幫你注入適合的實現類,而不是你自己去創建bean實例。有3種基本實現方式:Interface injection、Setter injection與Constructor injection。
4. 應用程序中獲取bean
1 <bean id="helloBean" class="chapter2.HelloBean">
2 <property name="helloWord">
3 <value>Hello yangay!</value>
4 </property>
5 </bean>
public static void main(String[] args) {
Resource rs = new ClassPathResource("applicationContext.xml");//從classpath下加載配置信息
BeanFactory factory = new XmlBeanFactory(rs);//基于xml格式配置文件的實例化方式,得到一個BeanFactory
HelloBean hello = (HelloBean)factory.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調用bean里定義的所有方法
System.out.println(hello.getHelloWord());
}
這是通過beanFactory管理Bean的方式,BeanFactory負責讀取Bean定義文件;管理對象的加載、生成;維護Bean對象之間的依賴關系;負責Bean的生命周期,對于簡單的應用程序來說,使用BeanFactory就已經足夠來管理Bean了。BeanFactory接口提供了六個方法管理Bean。
另外還可以通過ApplicationContext來獲取Bean對象:
1 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//從classpath下加載配置信息
2 HelloBean hello = (HelloBean)ctx.getBean("helloBean");//獲取id="helloBean"的bean,此時可以調用bean里定義的所有方法
第二章 spring IoC、AOP實例及分析
1. IoC實例一
控制反轉用得最多的是為業務類注入Bean對象,典型的應用是在結合struts開發是,為struts的action類來注入springDao,這樣在業務層如action類中不再介入spring API,但同時又可以利用spring提供的所有便捷功能。低層實現細節發生的變化,對業務層來說是透明的,不但降低了程序的偶合性,而且也提高了DAO對象的重用性。在這個例子中,為了簡單起見,我們只為HelloBean注入了一個字符串,而不是注入實體Bean。但這只體現出了控制反轉的特點,對于依賴注入DI并沒有得到明顯的體現。
1)首先編寫一個簡單的JAVABEAN
1 public class HelloBean {
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)接下來編寫 Bean定義文件,定義文件告訴spring如何完成以來關系的注入等動作。我們這里命名文件為applicationContext.xml,定義文件中省略了xml文件的頭
1 <bean id="helloBean" class="chapter2.HelloBean">//應用程序中用于取得bean的標志
2 <property name="helloWord">//設置了bean中setter的名稱
3 <value>Hello yangay!</value>//設置了將要注入的值
4 </property>
5 </bean>
3)最后編寫一個簡單的示范程序
1 public class SpringDemo {
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,此時可以調用bean里定義的所有方法
6 System.out.println(hello.getHelloWord());
7 }
8 }
運行之,將會看到在bean定義文件中為"helloWord"設置的值"Hello yangay!"被打印出來。
--------------------
2. 1. IoC實例二
其實spring IoC的初衷就是降低程序的偶合性,使開發者面向接口編程,使業務層設計不以來于實現,具體依賴與哪個bean是在speing培植文件中來定義的。同樣在這里寫一個示范程序,包括一個接口,兩個實現類,一與業務有關的Business類,Business類依賴的是接口,而不是接口的實現,具體需要哪個實現是由spring容器來實現注入的。
1)接口
只聲明了一個保存的方法
1 public interface IDeviceWriter {
2 void svaeToDevice();
3 }
2)第一個實現IDeviceWriter接口的類,存儲到
軟盤
1 public class FloppyWriter implements IDeviceWriter{
2
3 public void svaeToDevice() {
4 System.out.println("存儲至軟盤
");
5 }
6 }
3)第二個實現IDeviceWriter接口的類,存儲到
硬盤
1
2 public class DiskWriter implements IDeviceWriter{
3
4 public void svaeToDevice() {
5 System.out.println("存儲至硬盤
");
6 }
7 }
4)業務類,依賴于抽象的IDviceWriter接口,要 存儲到磁盤還是軟盤是由spring配置文件來決定的
1 public class Business {
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 }
5)bean的定義文件
1 <bean id="floppyWriter" class="chapter2.FloppyWriter"/>
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>
將id為writer的bean注入到business Bean中,在Business對象中可以調用FloppyWriter的所有方法,實現了將數據保存至軟盤的功能。
6)測試類
1 public class SpringDemo2 {
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 }
現在如果我們想要把數據保存到硬盤,而不是軟盤了,我們只需要修改bean的配置文件,讓業務類Business依賴于diskWriter既可,Business不做任何的修改。這也是面向接口編程的好處所在。
posted on 2007-09-04 00:22
楊愛友 閱讀(1391)
評論(6) 編輯 收藏 所屬分類:
java相關技術