我可以在servlet中声明参数化构造函数,它只是构造函数吗?
如果不是,为什么?
答案 0 :(得分:8)
没有
Servlet实例是由容器通过反射创建的,他们希望找到一个public,no-arg构造函数(默认构造函数)。
要配置servlet,请使用web.xml文件中指定的servlet参数。这些将传递给您的servlet的init()
方法。
虽然servlet容器可能可能选择非默认构造函数并将字符串强制转换为简单类型并反复调用构造函数,但这不是Servlet规范所要求的。 / p>
部分原因可能是历史性的;在依赖注入系统使这种替代方案得到广泛实践之前,servlet首次被指定。但是,这样的构造函数相当有限;传递可以从web.xml中指定的简单字符串创建的参数是切实可行的,但是更有用的对象 - 例如DataSource
- 会很尴尬。
尽管在servlet中有最终的成员变量会很好。
JSR以前称为“WebBeans”(我认为是JSR 299),它将为Servlet中的依赖注入支持提供一些标准。这可能会解决当前方法中的一些缺点。
答案 1 :(得分:1)
由于servlet由容器实例化,因此它们需要一个无参构造函数。
此外,容器可以重用servlet,并且不会在重用时调用构造函数。
答案 2 :(得分:1)
您需要通过<servlet-param>
初始化变量或使用类似Spring的框架,它允许您将Servlet代理到与其他任何bean一样的其他类。
答案 3 :(得分:1)
不!我们不能在servlet中提供参数化构造函数.servlet容器创建
sevrlet的对象。容器将根据Class.forName(String classname)
创建对象。我们可以使用Class.forName()
创建一个类的对象,如果该类只包含默认构造函数,因为容器在创建对象时使用Class.forName()
代码,我们不会将参数化构造函数写为部分输出servlet。即使我们想编写参数化构造函数,我们也可以从service()
方法调用构造函数!