[已注销]对《Spring揭秘》的笔记(2)

Spring揭秘
  • 书名: Spring揭秘
  • 作者: 王福强
  • 页数: 680
  • 出版社: 人民邮电出版社
  • 出版年: 2009.8
  • 第15页
    ==过去的方法是什么?==
    当一个类依赖于另一个类的时候,最简单的方式就是在构造函数中新建相应的依赖类。就像我们削铅笔的时候会先把卷笔刀准备好(体现在程序中就是关键字new)。
    public class Pencil {
    
        private ISharpener sharpener;
    
        //构造依赖类
        public Pencil() {
            sharpener =  new DeliSharpener(); //Deli的卷笔刀
        }
    
         public void getSharpened() {
             sharpener.sharpen();
         }
    }
    
    ==缺点在哪里?==
    1.ISharpner的一个实现方式DeliSharpener以硬编码的形式编入了代码中,如果要还用其它牌子的卷笔刀,就要去修改程序源代码。
    2.如果系统中有很多削铅笔的请求,那么系统中就会有很多个卷笔刀的实例,但它们调用的是同一个方法。显然这不是一个好的设计,实例化和回收都是需要开销的。
    ==有没有更好的办法?==
    有没有可能每次削铅笔的时候,卷笔刀自己把它准备好,而不要我们每次都重新把他们造出来?毕竟我们使用的只是卷笔刀提供的“卷笔”的服务,而不是卷笔刀本身!
    ==改进==
    如果系统中有一个公共的卷笔刀,所有铅笔都可以调用它所提供的sharpen方法,这就成了单态模式(Singleton),这就是一个好的设计。
    ==什么是IoC?==
    而IoC的反转就反转在本来是我们去找刀片,现在变成了刀片来找我们。两者之间的桥梁就是IoC Service Provider,我们可以把它看成一个服务员,在调用服务的人和提供服务的人之间来回跑。
    ==问题又来了==
    服务员又不是我们肚子里的蛔虫,怎么知道我们需要哪些服务呢?
    可以通过注入(injection)的方法来告诉服务员它需要哪些服务
    1.通过构造方法注入
    public Pencil(ISharpener sharpener) {
    
        this.sharpener = sharpener;
    
    }
    
    服务员会检查铅笔的构造方法,一看它需要卷笔刀,就自动送上一枚。
    2.通过setter方法注入
    public class Pencil {
    
        private ISharpener sharpener;
    
        //setter
        public void setSharpener(ISharpener sharpener) {
            this.sharpener = sharpener;
        }
    
    }
    
    当对象构造完成以后,服务员会根据setter方法来为Pencil注入Sharpener。
    3.接口注入
    public interface PencilCallable() {
    
        public void injectSharpener();
    
    }
    
    服务员找到这个接口,通过injectSharpener这个方法把Sharpener注入到Pencil中。
    构建在IoC上的Pencil类可以重用,因为Sharpener的牌子并没有倾入代码。我们可以用Pencil的构造方法来生成一支Lide牌卷笔刀削的铅笔。前提是LideSharpener已经实现过ISharpener接口。
    Pencil pencil = new Pencil(new LideSharpener())
    
    2011-07-28 12:37:58 1人喜欢 回应
  • 第139页
    ==为什么要有AOP?==
    面向对象(OOP)的核心思想就是把一样东西事物的状态和方法封装在它的内部,这样东西就叫做对象(object),对象的状态(属性)不能共享,但是方法或者说方法的某些片段却可以共享。把所有相同的方法片段抽象出来,独立成为一个切面(Aspect),就是面向切面编程。
    ==AOP的实现==
    AOP的实现有很多方法:
    1.动态代理
    2.动态字节码
    3.Java代码生成
    4.类加载器
    5.语言本身支持AOP
    Spring用的是动态代理
    ==什么是代理?==
    所谓代理就是代别人做事,举一个简单例子:小明想要送花给小红,但是不好意思,于是委托小刚来替他送花,这里小刚就成为了小明的代理。
    public interface Man() {
        public void giveFlower();  //看来是个男人都会这一招
    }
    
    public class XiaoMing implements Man {
        public void giveFlower() {
            //送花
        }
    }
    
    public class XiaoGang implements Man {
        private XiaoMing xiaoming; //委托人
        public void giveFlower() {
            //先自我介绍一下啥的
            xiaoming.giveFlower();
            //别忘了说再见
        }
    }
    
    
    代理中拥有对委托者实例的引用,在代理的giveFlowers方法中,小刚调用了小明的giveFlowers方法,并且之后和之后和实现了一些其它逻辑。
    代理相当于在委托者的外面包了一层东西,我们可以用它实现一些共有的切面,比如权限控制,日志记录等等。但是这种静态的代理有个很大的缺点,就是对于每个不同的对象都要产生对应的代理对象,试想一些如果世界上有无数个害羞的小明,就要有无数个仗义的小刚,怎么可能嘛?
    2011-07-31 19:51:44 3人喜欢 回应

[已注销]的其他笔记  · · · · · ·  ( 全部295条 )

The Design of Everyday Things
1
About Face 3
6
Engineering a Compiler
1
人有人的用处
8
Understanding the Linux Kernel
4
计算机程序设计艺术
1
公正
1
The Art of Doing Science and Engineering: Learning to Learn
1
科学革命的结构
7
罗素论教育
3
三十六大
1
娱乐至死
3
Real World Haskell
2
Writing Analytically
1
Is Parallel Programming Hard, And, If So, What Can You Do About It?
1
计算机与人脑
1
组合数学
2
菊与刀
1
Rework
5
翻译新究
4
计算机程序的构造和解释(原书第2版)
5
The Laws of Simplicity
4
计算机组成与设计硬件/软件接口
6
写给无神论者
2
放任自流的时光
3
哥德尔、艾舍尔、巴赫
2
树上的男爵
2
C++语言的设计与演化
1
Land of LISP
7
C陷阱与缺陷
2
CUDA by Example
3
C++沉思录
1
世界尽头与冷酷仙境
4
Head First C
2
刀锋
1
并行编程模式
2
The Ph.D. Grind
2
计算机系统结构
2
禅与摩托车维修艺术
14
流浪的面包树
2
翻译研究
18
An Introduction to Programming in Emacs Lisp
1
GNU Emacs Lisp 编程入门
1
计算机系统概论
1
编码
3
拖延心理学
1
古今数学思想(一)
1
挪威的森林
9
奇特的一生
7
GPU高性能运算之CUDA
5
那些年,我们一起追的女孩
8
十八岁给我一个姑娘
2
C++编程思想(第1卷)
9
多核计算与程序设计
8
少有人走的路
5
忧伤的情欲
3
Hackers & Painters
7
哲学的慰藉
9
男人来自火星 女人来自金星
8
旅行的艺术
14
活着活着就老了
1
如何阅读一本书
7
Data-intensive Text Processing With Mapreduce
1
学习GNU Emacs
1
给研究生的学术建议
3
C专家编程
2
Head First Java(第二版·中文版)
1
自私的基因
1
C程序设计语言
2
计算机网络
3
自由在高处
2
大话设计模式
16
计算机网络
12