美文网首页
2. JavaBeans规范

2. JavaBeans规范

作者: wyh001 | 来源:发表于2023-09-14 21:36 被阅读0次

在Spring中,由其管理的类都可称为bean,而依赖注入解析bean时,会用到javabeans的规范。

JavaBeans

详细内容见:JavaBeans(TM) Specification 1.01 Final Release

Properties 属性

  1. Accessor methods 属性访问器方法

    setXx(Xx)

    getXx()

  2. Indexed properties 索引化的属性

    setXx(int, Type)

    getXx(int)

  3. Bound properties 绑定属性 Xx

    对属性Xx绑定事件监听器,属性变更后,发送事件

    void addXxListener(PropertyChangeListener p);

    void removeXxListener(PropertyChangeListener p);

  4. Constrained properties 受限制的属性 Xx

    对属性Xx绑定事件监听器,属性变更前,发送事件,事件监听器中可阻止该属性值变更

    void addXxListener(VetoableChangeListener p);

    void removeXxListener(VetoableChangeListener p);

Methods 方法

Events 事件

EventObject 事件状态对象

EventListener 事件监听器

事件.png

序列化

详见:java对象序列化规范

示例:

// JavaBean
public class Test1Bean implements Serializable {
    private String name;

    private String[] datas;

    // 访问器属性
    public String getName() {
        return name;
    }

    public void setName(String name) {
        String oldVal = this.name;
        this.name = name;
        // 绑定属性
        this.propertyChangeSupport.firePropertyChange("name", oldVal, name);
    }

    public String[] getDatas() {
        return datas;
    }

    public void setDatas(String[] datas) {
        this.datas = datas;
    }

    // 索引化的属性
    public void setDatas(int i, String data) throws PropertyVetoException {
        // 受限制的属性
        this.vetoableChangeSupport.fireVetoableChange("datas", this.datas[i], data);
        String oldVal = this.datas[i];
        this.datas[i] = data;

        // 绑定属性
        this.propertyChangeSupport.firePropertyChange("datas", oldVal, data);
    }

    public String getDatas(int i) {
        return datas[i];
    }

    public int getAge() {
        return 0;
    }

    public void setAge(int name) {
    }

    public void normalMethod1() {
    }

    // 事件管理
    private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    private final VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
        propertyChangeSupport.addPropertyChangeListener(propertyChangeListener);
    }

    public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener) {
        propertyChangeSupport.removePropertyChangeListener(propertyChangeListener);
    }

    public void addVetoableChangeListener(VetoableChangeListener vetoableChangeListener) {
        vetoableChangeSupport.addVetoableChangeListener(vetoableChangeListener);
    }

    public void removeVetoableChangeListener(VetoableChangeListener vetoableChangeListener) {
        vetoableChangeSupport.addVetoableChangeListener(vetoableChangeListener);
    }
}

主要类

获取bean的元数据

JavaBeans元数据.png

Introspector 内省

解析某个类的元数据,包括该类的属性、方法和事件信息

BeanInfo 元数据

表示某个bean的元数据,包含属性描述、方法描述和事件描述等信息

# 获取bean的元数据
private static void s2_31() throws Exception {
    // bean的元数据
    final BeanInfo beanInfo = Introspector.getBeanInfo(Test1Bean.class);

    // 属性描述信息
    final PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
    log.info("propertyNames[{}]", Arrays.stream(propertyDescriptors).map(PropertyDescriptor::getName).collect(Collectors.toList()));

    // 方法描述信息
    final MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
    log.info("methodNames[{}]", Arrays.stream(methodDescriptors).map(MethodDescriptor::getName).collect(Collectors.toList()));

    // 事件描述信息
    final EventSetDescriptor[] eventSetDescriptors = beanInfo.getEventSetDescriptors();
    log.info("eventNames[{}]", Arrays.stream(eventSetDescriptors).map(EventSetDescriptor::getName).collect(Collectors.toList()));
}

属性编辑器

属性编辑器.png

PropertyEditor 属性编辑器/类型转换器

各种类型和字符串的互相转换

实现自定义的属性编辑器可继承PropertyEditorSupport

// 自定义Integer类型的属性编辑器
public class CusIntegerPropertyEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        super.setValue(Integer.valueOf(text));
        super.setAsText(text);
    }
}

PropertyEditorManager 属性编辑器管理者

private static void s2_32() throws FileNotFoundException {
    // Integer和字符串的转换
    final PropertyEditor propertyEditor = PropertyEditorManager.findEditor(Integer.class);
    propertyEditor.setAsText("12");
    Integer val = (Integer) propertyEditor.getValue();
    log.info("val=[{}]", val);

    // 注册自定义的属性编辑器
    PropertyEditorManager.registerEditor(Integer.class, CusIntegerPropertyEditor.class);
    final PropertyEditor propertyEditor1 = PropertyEditorManager.findEditor(Integer.class);
    Integer val1 = (Integer) propertyEditor1.getValue();
    log.info("val=[{}]", val);
}

相关文章

  • JSP 之JavaBean

    JavaBean 简介 JavaBeans 就是符合某种特定规范的 Java 类。使用 JavaBeans 的好处...

  • java常用名词

    JavaBeans JavaBeans事实上有三层含义。首先,JavaBeans是一种规范,一种在Java(包括J...

  • JavaBean

    一、JavaBean 1、Javabeans就是符合某种特定规范Java类。使用Javabeans的好处是【解决代...

  • JSP学习笔记(三)

    JavaBeans:符合某种规定的规范的java类。使用javabeans的好处是解决代码重复编写,减少代码冗余,...

  • javaBean

    javabeans就是符合某种特定的规范的java类。使用javabeans的好处是解决代码重复编写,减少代码冗余...

  • java基础-day09-面向对象3.0

    面向对象3.0 1. JavaBeans规范类对象调用 2. 多类合作【重点】 2.1 汽修厂和汽车 2.2 汽车...

  • Java Web基础学习---JSP(四)

    Javabean Javabean简介 Javabean就是符合某种特定的规范的java类,使用Javabeans...

  • 黑猴子的家:Scala Bean 属性

    JavaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个...

  • JavaEE学习记录(JavaBeans)

    JavaBean Javabeans符合某种特定规范的Java类. 解决代码重复编写,减少代码冗余,功能区分明确,...

  • JavaBeans

    JavaBeans的出现是为了减少JSP中的代码数量,增加代码的重用性。因为写在JSP中的代码不可能重用,但是Ja...

网友评论

      本文标题:2. JavaBeans规范

      本文链接:https://www.haomeiwen.com/subject/flqvvdtx.html