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