使用嵌入式Jetty:如何关联ServerConnector与Server?解析二者调用差异
嵌入式Jetty中Server与ServerConnector的关联逻辑详解
嘿,这个问题问到点子上了!在嵌入式Jetty的场景里,Server和ServerConnector的绑定是个两步走的过程,咱们把这两个操作的区别和关系掰扯清楚:
1. new ServerConnector(server):绑定归属关系,但未纳入管理
当你用这个构造方法创建ServerConnector时,其实是在连接器内部记录了它要归属的Server实例——相当于给这个连接器“定了东家”,让它知道自己属于哪个Server。但这时候,Server本身完全不知道这个连接器的存在,它的连接器管理列表里还没有这个对象,所以就算你启动Server,这个连接器也不会被启动,自然不会监听任何端口。
2. server.addConnector(connector):正式纳入Server管理
这一步才是把连接器加入到Server的官方管理体系里:
- Server会把这个连接器加入到自己的内部连接器集合中
- 当Server启动/停止时,会同步启动/停止这个连接器
- Server的配置、生命周期管理都会覆盖到这个连接器上
二者的关系:配套操作,绝非互斥或重复
这两个操作是缺一不可的配套步骤,既不互斥也不重复:
- 只做
new ServerConnector(server):连接器有了归属,但Server不认它,等于白创建 - 只做
server.addConnector(connector)(如果连接器没先绑定Server):会直接抛出异常,因为连接器不知道自己该归属哪个Server
标准正确用法示例
// 创建核心Server实例 Server server = new Server(); // 1. 创建连接器时绑定Server ServerConnector httpConnector = new ServerConnector(server); httpConnector.setPort(8080); // 设置监听端口 // 2. 将连接器正式加入Server管理 server.addConnector(httpConnector); // 启动Server(此时会同步启动所有已添加的连接器) server.start(); server.join();
补充:另一种绑定方式
除了构造方法传Server,也可以先无参创建连接器,再通过connector.setServer(server)绑定归属,之后再调用addConnector,效果是一样的:
ServerConnector connector = new ServerConnector(); connector.setServer(server); server.addConnector(connector);
内容的提问来源于stack exchange,提问作者gabriel119435
相关产品推荐
相关产品推荐

