【问题标题】:What is the advantage of using Java Beans?使用 Java Bean 有什么好处?
【发布时间】:2010-08-11 17:37:55
【问题描述】:

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

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

  2. Java Bean 是否可以包括带参数的构造函数以及无参数的构造函数?

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

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

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

【问题讨论】:

标签: java javabeans


【解决方案1】:

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

  1. 实体 Bean
  2. 有状态会话 Bean
  3. 无状态会话 Bean

下面是一些细节......

实体 Bean

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

有状态会话 Bean

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

无状态会话 Bean

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

【讨论】:

    【解决方案2】:

    他们遵守明确的规范

    多亏了这一点,有很多工具可以简化 Javabeans 的工作(或者反过来)。有些工具可以根据某种风格的某些数据(XMLJSONCSVDDL 等)自动生成它们,反之亦然,也可以像读取/操作/映射它们一样Commons BeanUtilsDozerEZMorph 等等。此外,还有很多 MVC/ORM 框架可以与 Javabeans 一起使用,例如 JPAHibernateJSFSpring 等。即使是像 Eclipse 这样有点体面的 IDE 也知道如何基于一些自动生成 Javabeans字段。

    围绕 Javabeans 的工具和框架让我们的生活更轻松。正是 Javabeans 规范使这些东西得以存在。

    【讨论】:

      【解决方案3】:

      最重要的是,Java Bean 是一个可重用的软件组件

      这意味着它没有与其他组件紧密耦合。如果你的 Java 类创建了另一个类的实例,或者返回了某个特定的实现类,那么它就不再是一个 bean。 Bean 涵盖了一些定义明确的功能,并且与其他类松散耦合。

      这样做的好处是您可以获得所有这些小部件,然后您可以很容易地一起工作。此外,这些易于重用和单元测试。

      即使您没有使用某些可视环境来耦合 bean(正如 bean 规范所建议的那样),这仍然是使用 bean 的一个原因:获得易于使用的小段代码。

      如果您不使用可视化工具,那么您的 bean 是否具有 0 参数构造函数或可序列化并不那么重要。

      【讨论】:

      • "如果你的 Java 类创建另一个类的实例,或者返回某个特定的实现类,它就不再是一个 bean。" ——你能澄清一下吗?例如,一个 bean 肯定可以创建/返回一个 String
      【解决方案4】:

      1) Beans 独立于平台,这意味着它可以在任何地方运行。

      2) 它可以在任何语言环境中运行,并且是分布式的。

      3) 可以控制Beans的方法、属性和事件。

      4) 配置 Java bean 很容易。

      5) bean 可以接收和创建事件。

      6) bean 的配置设置可以持久存储,并且可以随时检索。

      【讨论】:

        【解决方案5】:

        最大的优势是您的 bean 是根据规范构建的,可以直接与“bean-compatible”库和框架一起使用。

        例如,大多数序列化框架(XML、JSON、YAML、...)通常可以直接使用 bean 而无需配置。

        【讨论】:

          【解决方案6】:

          我想 bean 的最大优点是可以(或多或少)以单个对象的形式传递数据。一个方法的定义不需要过多的参数,可以直接使用bean,直接以对象的形式传递数据。它提供了更好的程序架构......这就是我的想法

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-26
            • 2012-10-11
            • 1970-01-01
            • 2012-11-28
            • 2010-09-21
            • 2011-04-28
            • 1970-01-01
            • 2011-09-16
            相关资源
            最近更新 更多