今天来讲一下让我疑惑了很久的JavaBean,SpringBean,POJO。

JavaBean

什么是Bean?在计算机英语中,Bean有可重复组件的意思。字面上理解的话,那么JavaBean就是Java中可重复的组件。很显然,如果这样理解的话范围会很大,所有对象基本都是Bean了,因为他们都可以重复。

事实上,JavaBean有明确的规范。

我们来看一下维基百科对JavaBean的定义。

In computing based on the Java Platform, JavaBeans are classes that encapsulate many objects into a single object (the bean). They are serializable, have a zero-argument constructor, and allow access to properties using getter and setter methods. The name "Bean" was given to encompass this standard, which aims to create reusable software components for Java.

从上面,我们了解到一个类要成为JavaBean,就需要满足以下几个条件:

  • 可序列化(Serializable)
  • 提供公有(Public)的无参构造器
  • 提供公有的(Public)getter和setter方法访问对象的属性
public class UserBean implements Serializable{    //实现Serializable接口
    //属性
    private String username;
    private String password;
    
    //无参构造方法  当没有带参构造方法时,可以省略,系统会自动提供。
    public UserBean(){}
    
    //getter和setter方法
    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username = username;
    }
    public String getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password = password;
    }
}

也就是说,JavaBean是遵守某些规范的可重用组件。

SpringBean

Spring框架的核心技术:IoC(控制反转)实现了对象间的解耦,而解耦的方式就是通过把Bean对象交给IoC容器管理,例如使用反射将对象实例化和依赖注入。

Bean对象?这就是我很疑惑的地方,这个Bean对象是JavaBean对象吗?如果是,那对于Dao层和Service层的对象,很明显地并不符合JavaBean的规范。

后来查阅资料得知,Spring中的Bean对象并不一定是JavaBean对象。注意,是不一定是,不是完全不是。

我们来看一下Spring官方文档对Bean的描述。

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

从官方的描述我们可以得知:

  • 在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。
  • bean是由Spring IoC容器实例化、组装和管理的对象。

这样一来,基本上所有Java对象都可以称为SpringBean了,只要他满足交给IoC容器管理。当然,也就包括JavaBean,Dao层和Service层的对象了。

不过这样一来,好像SpringBean的概念好像更接近一开始我们理解的JavaBean的概念。

最后,我们可以得出这样的结论:SpringBean > JavaBean,他们是包含与被包含的关系。

POJO

POJO(Plain Ordinary Java Object),字面理解中文意思是普通Java对象。

普通?到底有多普通?普通到什么程度?

我们来看一下维基百科对POJO的定义。

Ideally speaking, a POJO is a Java object not bound by any restriction other than those forced by the Java Language Specification; i.e. a POJO should not have to

  1. Extend prespecified classes, as in

    public class Foo extends javax.servlet.http.HttpServlet { ... }
  2. Implement prespecified interfaces, as in

    public class Bar implements javax.ejb.EntityBean { ... }
  3. Contain prespecified annotations, as in

    @javax.persistence.Entity public class Baz { ... }

从上面我们可以得知,一个POJO类:

  • 不应该继承已有的类
  • 不应该实现已有的接口
  • 不应该包含已有的注解

POJO是一个简单的、普通Java对象,它包含业务逻辑处理或持久化逻辑等。

但不是JavaBean、EntityBean等,不具有任何特殊角色,不继承或不实现任何其它Java框架的类或接口。

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

写在最后

以上大概就是JavaBean,SpringBean,POJO的概念了。以上只是我对一个初步的理解,可能会有不正确和不周全的地方,还请谅解。相信随着以后的学习的深入,会有更深入的理解,本文也将持续更新。

参考链接:

  1. https://en.wikipedia.org/wiki/JavaBeans
  2. https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-introduction
  3. https://en.wikipedia.org/wiki/Plain_old_Java_object
  4. https://blog.csdn.net/weixin_41866960/article/details/83927802
©著作权归作者所有

仅有一条评论

发表评论

正在加载 Emoji