tomcat 7 源码分析-4 server初始化背后getServer().init()
getServer().init()其实就是调用server的init函数,但是server是个interface,还要看其在new的时候,这个就是多态。
- digester.addObjectCreate( "Server" ,
- "org.apache.catalina.core.StandardServer" ,
- "className" );
- digester.addSetProperties("Server" );
- digester.addSetNext("Server" ,
- "setServer" ,
- "org.apache.catalina.Server" );
digester.addObjectCreate("Server",
"org.apache.catalina.core.StandardServer",
"className");
digester.addSetProperties("Server");
digester.addSetNext("Server",
"setServer",
"org.apache.catalina.Server");
上面的句子就类似于
- Server server = new StandardServer();
- server.init();
Server server = new StandardServer();
server.init();
具体的继承关系的部分如图
源代码很好的运用了interface和抽象类,并且继承和接口实现都有运用。可以很好的理解接口和抽象类的关系。
依照这个UML图,写了个小的demo还分析,打包在附件中,interface和class在多态上的作用。
运行了如下语句,结果发现结果一样。
- Server server = new StandardServer();
- server.init();
- LifecycleMbeanBase lserver = new StandardServer();
- lserver.init();
- Lifecycle lcserver = new StandardServer();
- lcserver.init();
Server server = new StandardServer();
server.init();
LifecycleMbeanBase lserver = new StandardServer();
lserver.init();
Lifecycle lcserver = new StandardServer();
lcserver.init();
StandardServer既实现了接口server,又继承了来自server父类lifecycle(也是一个接口)实现的类LifecycleMbeanBase 。
这个关系就显的复杂了,到底在多态的时候怎么运作的?
可否这样认为:1. 实现接口,也是一定意义上的继承 2.接口的方法,最终运行还要看它实现的类
StandardServer最终拥有了server,lifecycle,MBeanRegistration三个特征。
server--定义很多例如全局Naming资源,端口号,地址等
lifecycle--规定了整个运行的状态,例如初始化后的状态可以使stop,也可以是starting,然后是started等。有点类似于状态机。
MBeanRegistration--资源的注册,涉及到JVM的管理