|
前言
最近在看阿里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. 【参考】分层领域模型规约:
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
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规范
所有属性都必须是private
所有外部访问必须通过setter、getter
不能有extend
不能有implments
不能包含预定注解,如@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类,不是一种技术,而是一种规范。它的方法命名,构造及行为必须符合特定的约定:
所有属性为private。
这个类必须具有一个公共的(public)无参构造函数
private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范。 。
这个类应是可序列化的,要实现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装配方式:
自动装配
使用 XML 装配
使用 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://blog.csdn.net/CrankZ/article/details/81508777
程序猿的技术大观园:www.javathinker.net
|
|