静态内部类:
Tomcat中大量使用了内部类.我对其中印象比较深的就是Endponit.
以NioEndpoint为例.
作为处理NIO类型的连接的入口(端点),他把Acceptor,Poller,SocketProcessor放在NioEndpoint中.有啥好处呢
设想一下,如果把这些提出来创建类,Nio类型的创建一批,Aio类型的创建一批. 这样不是也可以吗?
答案是:当然可以.
但我是认为, 将其组合在一起, 更能体现其高内聚性,不同类型的相关类组合在一起.使NioEndpoint具有一个丰富的功能,体现了更好的封装. 并且静态内部类依赖于外部类,不依赖于外部类对象,也就是我们不需要实例化外部类就可以使用静态内部类.所以并不会影响其他类使用静态内部类,又体现了低耦合性.
所以,在某些需要多个功能类组合在一起才能完成某个操作时,我们可以尝试使用静态内部类的方法,更能体现操作的完整性.
生产者消费者
还是以NioEndpoint为例: 其内部类Acceptor 与Poller ,PollerEvent 完美的组成一个典型的生产者消费者模式
Acceptor 循环接收请求,然后将请求封装到PollerEvent, 注册到Poller.queue队列上去.Poller不断从queue队列里取PollerEvent做进一步处理
将请求与处理解耦.
设计模式
凡是优秀的框架,都少不了用那么一两个设计模式.
- 模板模式: Lifecycle接口,定义了组件生命周期的各个阶段. LifecycleBase:它实现了Lifecycle的init、start、stop等主要逻辑.init(),start(),stop()作为通用方法,定义算法骨架,调用模板方法,将具体的功能实现延迟到子类去实现. [LifecycleBase中的模板方法]
- 观察者模式:LifecycleListener 代表的是抽象观察者, lifecycleEvent代表了一个事件 当组件的状态发生变化时,会调用fireLifecycleEvent将事件广播到LifecycleListener监听器中, 对应的监听器就对事件做出相应
- 责任了模式Tomcat中的层级调用,是理解Tomcat启动,初始化的关键.每层都持有下家的引用.请求在请求链上传递, 每层组件处理完成后,就将请求交个下家继续处理.直至每层都处理完毕. Tomcat有哪些是责任链模式呢? Cotainer容器Engine->Host->Context->Wrapper Pipeline 和 Valve 组成的处理链 ApplicationFilterChain 过滤器链