>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19043 个阅读者 刷新本主题
 * 贴子主题:  POJO与JavaBean与SpringBean的概念与区别 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-07-11 06:34:08     消息  查看  搜索  好友  邮件  复制  引用

前言

最近在看阿里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
  Java面向对象编程-->Lambda表达式
  JavaWeb开发-->Web运作原理(Ⅰ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->计算属性和数据监听
  Vue3开发-->计算属性和数据监听
  Netty初识
  git 仓库常用指令
  MyBatis+Spring 事务管理
  Spring事务的声明和管理
  重新理解响应式编程
  SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
  @SessionAttribute和@SessionAttributes的区别
  什么是Redis?Redis的各项功能解决了哪些问题?
  解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制
  Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)...
  使用 Flask-RESTful 设计 RESTful API
  【Web服务开发】基于Java开发代驾定位系统,2天完成脚手架
  Spring Boot集成EHCache实现缓存机制
  从响应式编程到“好莱坞”
  Java-CORBA
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。