【发布时间】:2009-06-03 16:42:08
【问题描述】:
我可以在 servlet 中声明参数化构造函数,它只是构造函数吗?
如果不是,那为什么?
【问题讨论】:
标签: java servlets jakarta-ee
我可以在 servlet 中声明参数化构造函数,它只是构造函数吗?
如果不是,那为什么?
【问题讨论】:
标签: java servlets jakarta-ee
没有。
Servlet 实例由容器通过反射创建,它们希望找到一个公共的、无参数的构造函数(默认构造函数)。
要配置您的 servlet,请使用 web.xml 文件中指定的 servlet 参数。这些将传递给您的 servlet 的 init() 方法。
虽然 可能 servlet 容器选择非默认构造函数并将字符串强制转换为简单类型并反射调用构造函数,但这不是 Servlet 规范所要求的。
部分原因可能是历史原因; servlet 早在依赖注入系统使这种替代方案得到广泛实践之前很久就被指定了。但是,这样的构造函数将是相当有限的;传递可以从 web.xml 中指定的简单字符串创建的参数是可行的,但更有用的对象(例如 DataSource)会很尴尬。
如果在 servlet 中包含 final 成员变量会很好。
JSR 以前称为“WebBeans”(我认为是 JSR 299),将为 Servlet 中的依赖注入支持提供一些标准。这可能会解决当前方法中的一些缺点。
【讨论】:
您需要通过 <servlet-param> 初始化变量或使用 Spring 之类的框架,它可以让您将 Servlet 代理到与任何其他 bean 一样的不同类。
【讨论】:
由于 servlet 由容器实例化,它们需要一个无参数的构造函数。
此外,容器可以重用 servlet,并且不会在重用时调用构造函数。
【讨论】:
不!我们不能在 servlet 中提供参数化构造函数。servlet 容器创建
sevrlet 的对象。容器将根据Class.forName(String classname) 创建对象。我们可以使用Class.forName()为类创建一个对象,如果该类仅包含默认构造函数。由于容器在创建对象时使用Class.forName()代码,我们不编写参数化构造函数作为servlet的一部分。即使我们要编写参数化构造函数,我们已经从service()method 调用构造函数!
【讨论】: