java - 使用 Java Bean 有什么好处?

标签 java javabeans

我相信我了解 Java Bean 是什么:Java 类包含无参数构造函数,可序列化,并使用 getter 和 setter 公开其字段。

  1. Java Bean 是否必须公开其所有字段才能成为 Bean?如果不是,它甚至必须暴露任何

  2. Java Bean 可以包括带参数的构造函数和无参数的构造函数吗?

  3. 除了符合某种编码风格之外,Java Bean 的用途是什么?似乎有很多关于“beans this”或“beans that”的讨论,但我不知道为什么它们特别有利。

我完全可以制作无参数构造函数。这可能有很多原因,如果无参数构造函数帮助编译器进行一些优化,我也不会感到惊讶。我也可以理解使您的类(class)可序列化。即使该类从未被序列化,它可能是,并且追溯执行它可能会很烦人(或者在黑盒库中是不可能的)。

但最令人好奇的是要求所有字段都可以通过 getter 和 setter 访问。当我需要它们时,我确实会在自己的工作中使用它们,但是 Java Beans 需要它们似乎很奇怪(可能所有这些,取决于我对 #1 的回答)。如果这是反射的问题,那么反射不能轻松地获取字段吗?如果不仅仅是简单地设置值是一个问题,如果方法存在,反射不能在字段上使用 getter/setter 吗?

最佳答案

JavaBean 本身并不是很有趣,它只是一个符合您上面列出的某些标准的 Java 类。但是,与此标准的一致性是构建 Java EE 框架的支柱之一,它出现在很多地方。我怀疑当您听说 JavaBeans 可以做的所有伟大事情时,企业 JavaBeans (EJB) 中所指的是什么。仅供引用,下面列出了几种不同类型的 EJB:

  1. 实体 Bean
  2. 有状态 session Bean
  3. 无状态 session Bean

下面是一些细节...

实体 Bean

您可能希望从底层数据库读取/写入对象。您可以使用 JDBC/SQL 来执行此操作,但也可以使用持久性框架。 Java EE 规范包括一个持久性规范,您可以将类声明为“实体 bean”,并让 Java 自动生成数据库表和逻辑,以在数据库中的条目和程序中的对象之间进行映射。最初,持久性需要使用应用程序服务器(例如 Glassfish、JBoss、Geronimo 等),但 AFAIK,您可以在没有服务器组件的桌面应用程序中使用它。实际实现由 Eclipselink、Toplink、Hibernate 等较低级别的库提供,但 Java API 抽象出它们之间的任何差异。

有状态 session Bean

假设您要创建一个存在于单独 JVM 上的 Java 类的实例。 JVM 可能在同一台物理机器上运行,但同样,它们也可能在通过网络进行通信的不同机器上。使用 Java EE 应用程序服务器,您可以创建一个可以由应用程序服务器的客户端实例化的类。这些客户端可以实例化一个类,该类的行为就像一个普通对象,但是在该对象上调用的任何方法都会在服务器上执行,并将结果传递回调用者。它基本上是一种面向对象的远程过程调用形式。

无状态 session Bean

这是有状态 session bean 的一个小变化。对于有状态 bean,如果服务器有 1000 个客户端,那么它可能必须创建 1000 个 bean 实例并记住哪个实例属于哪个客户端。使用无状态 bean,服务器会创建一个 bean 池,而不必费心记住哪个客户端拥有哪个 bean。当客户端调用一个方法时,服务器从池中挑选一个 bean 并使用它,完成后将它返回到池中。当您希望服务器记住每个客户端的详细信息时,您使用有状态 session bean,当您不需要记住客户端特定详细信息时,您将使用无状态 bean。请注意,无状态 bean 很可能有状态,只是客户端不会对这种状态感兴趣。

关于java - 使用 Java Bean 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461199/

相关文章:

java - 我正在尝试将值插入 MySQL 数据库,但出现 NullPointerException

java - 如何使用 Primefaces 时钟组件获取 UTC 格式的日期时间?

java - BeanMap 到 HashMap 的转换?

java - 使用 gdata-java-client 获取 Picasa 的图像直接 URL

java - 如何检查 Codenvy 生成的 java WAR 文件?

java - Java中的数组 "remember"它们的类型如何?

java - 如何通过@Autowired 或 property setter 获取相关的 Spring beans

java - 2 秒后第二个线程

jsp - 如何从 servlet 设置 JSP UseBean 值

java - J2EE,实体 Bean - User1 扩展 User