POJO与JavaBean与SpringBean的概念与区别

前言

最近在看阿里Java开发手册的过程中发现了大量的POJO关键字,之前也一直听说JavaBean和SpringBean,但是他们之间的概念还不是很清楚,所以最近学习了一下,写下了这篇文章。

先来看一下阿里Java开发手册中提到“POJO”这个关键字的片段。

阿里Java开发手册

一、编程规约

(一) 命名风格

8. 【强制】POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型Boolean isDeleted;的属性,它的方法也是isDeleted(),RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到,进而抛出异常。

16. 【参考】各层命名规约:

B) 领域模型命名规约

4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

(四) OOP规约

8. 关于基本数据类型与包装数据类型的使用标准如下:

1) 【强制】所有的POJO类属性必须使用包装数据类型。

说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。 正例:数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险。 反例:比如显示成交总额涨跌情况,即正负x%,x为基本数据类型,调用的RPC服务,调用不成功时,返回的是默认值,页面显示为0%,这是不合理的,应该显示成中划线。所以包装数据类型的null值,能够表示额外的信息,如:远程调用失败,异常退出。

9. 【强制】定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。 反例:POJO类的gmtCreate默认值为new Date();但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

12. 【强制】POJO类必须写toString方法。使用IDE中的工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。 说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。

18. 【推荐】final可以声明类、成员变量、方法、以及本地变量,下列情况使用final关键字:

2) 不允许修改引用的域对象,如:POJO类的域变量。

3) 不允许被重写的方法,如:POJO类的setter方法。

(九) 其它

2. 【强制】velocity调用POJO类的属性时,建议直接使用属性名取值即可,模板引擎会自动按规范调用POJO的getXxx(),如果是boolean基本数据类型变量(boolean命名不需要加is前缀),会自动调用isXxx()方法。 说明:注意如果是Boolean包装类对象,优先调用getXxx()的方法。

五、MySQL数据库

(四) ORM映射

2. 【强制】POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resultMap中进行字段与属性之间的映射。 说明:参见定义POJO类以及数据库字段定义规定,在<resultMap>中增加映射,是必须的。在MyBatis Generator生成的代码中,需要进行对应的修改。

8. 【推荐】不要写一个大而全的数据更新接口。传入为POJO类,不管是不是自己的目标更新字段,都进行update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行SQL时,不要更新无改动的字段,一是易出错;二是效率低;三是增加binlog存储。

六、工程结构

(一) 应用分层

3. 【参考】分层领域模型规约:

  1. DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  2. DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  3. BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
  4. AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  5. VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
  6. Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

(二) 二方库依赖

5. 【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象。

附2:本手册专有名词

1. POJO(Plain Ordinary Java Object): 在本手册中,POJO专指只有setter / getter / toString的简单类,包括DO/DTO/BO/VO等。

-------------------------------------------------------------------------------------------------

OK,看完了。我们正式开始

POJO

概述

学习一个概念或者术语我一般习惯先从名字入手。

POJO(Plain Old Java Object)从字面上翻译为“简单老式的java对象”或者 “普通java类”

POJO是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的Java对象。

POJO规范

  1. 所有属性都必须是private
  2. 所有外部访问必须通过setter、getter
  3. 不能有extend
  4. 不能有implments
  5. 不能包含预定注解,如@Entity public class Hello

一般来说,只有private的属性和public的getter、setter而且没有其他继承、实现等等乱七八糟功能的就是POJO。

举个例子

public class POJO {
    // 私有属性
    private String value;
    // 提供公开getter、setter
    public String getValue() {
         return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

总结

阿里Java开发手册中这样说的

1. POJO(Plain Ordinary Java Object): 在本手册中,POJO专指只有setter / getter / toString的简单类,包括DO/DTO/BO/VO等。

很清晰明了,但是这个toString是阿里为了开发方便强制规定的,并不是POJO的定义。所以我们根据以上的分析,可以总结一下

POJO是一个简单的、普通Java对象,特点是有private的属性和public的getter、setter,除此之外不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。 

JavaBean

学习一个概念或者术语我一般习惯先从名字入手。

Java是咖啡的意思,而Bean是咖啡豆,意思就很明显了,咖啡豆是咖啡的基础,所以Bean也就是Java的基础组件的意思。

JavaBean 是一种JAVA语言写成的可重用组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。它的方法命名,构造及行为必须符合特定的约定:

  1. 所有属性为private。
  2. 这个类必须具有一个公共的(public)无参构造函数
  3. private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范。 。
  4. 这个类应是可序列化的,要实现serializable接口。

举个例子:

public class JavaBean implements java.io.Serializable { 
    // 实现serializable接口。 
    private static final long serialVersionUID = 1L; 
    // 私有属性
    private String value; 
    //无参构造器 
    public JavaBean () { 
    }

    // 提供公开getter、setter
    public String getValue () { 
        return value; 
    }
    public void setValue (String value) { 
        this.value = value; 
    }
    // JavaBean可以有其它的方法 
    public void hello() { 
        System.out.println("hello"); 
    } 
}

POJO与JavaBean两者有什么区别

简单说:POJO按照JavaBean的规则来,就可以变成JavaBean。

或者说,当一个POJO可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,他就是一个JavaBean

SpringBean

在最早的版本中,Spring是被设计用来管理JavaBean的,所以Spring管理的对象会被称为“bean”。当然,现在Spring已经可以管理任何对象,即使它不具备默认构造器和设置方法(getter和setter)这些JavaBean的特性。不过“Spring bean”这个术语仍然被保存了下来。

什么是SpringBean

引用《Spring实战》(Spring in action) 中的一句话:

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。相比之下,Spring 容器中的 bean 的生命周期就显得相对复杂多了。

简单的说:SpringBean是受Spring管理的对象。所有能受Spring容器管理的对象,都可以成为SpringBean。

Spring中如何创建Bean

SpringBean的知识点很多,这里只是简单介绍。不详谈

传统的的Javabean,如果我们要创建一个 Bean,我们就要使用关键字 New

但是,在 Spring 中,Bean 的创建是由 Spring 容器进行的,也就是说,在 Spring 中使用 Bean 的时候,不是由关键字 New 来创建实例了。

Spring中Bean装配方式:

  1. 自动装配
  2. 使用 XML 装配
  3. 使用 Java 装配

Spring Bean与JavaBean区别

规范:

Spring容器对Bean 没有特殊要求,不像JavaBean 一样遵循一些规范(不过对于通过设值方法注入的Bean,一定要提供setter 方法。)

用处:

传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean。

生命周期:

在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收

Spring中的Bean由Spring容器管理其生命周期行为,较为复杂,这里不详谈。

 

参考:

https://stackoverflow.com/questions/3527264/how-to-create-a-pojo

https://en.wikipedia.org/wiki/Plain_old_Java_object

https://www.quora.com/What-is-POJO-in-Java

https://www.jianshu.com/p/224489dfdec8

http://losgti.top/2018/05/01/JavaBean-EJB-POJO%E7%9A%84%E5%8C%BA%E5%88%AB/

https://blog.csdn.net/chenchunlin526/article/details/69939337

http://www.cnblogs.com/jingmoxukong/p/4532680.html

http://www.importnew.com/14019.html

 

猜你喜欢

转载自blog.csdn.net/CrankZ/article/details/81508777
今日推荐