Java Bean
学习Java的时候,不知道Java Bean到底是个什么东西,感觉不是很好理解,所以做下学习笔记记录一下帮助理解。
首先放概念:
- JavaBean:符合 JavaBean 规范的 Java 类,是可重复使用组件
- 成员:属性(property)、方法(method)、事件(event)
- JavaBean 的属性由 getter/setter 方法所决定,说某个类有 age 属性,意味着该类包含 setAge() 或 getAge() 方法
- 通常作为 DTO(数据传输对象),用来封装值对象,在各层之间传递数据
- 一般用作数据库实体类,即一个类对应一张数据库表
Java Bean规范
- 类使用public修饰
- 有public修饰的无参构造器
- 含有属性,属性都用private修饰,且有public修饰的setter、getter方法
总结:所以Java Bean也是一个类,只不过它要满足了一些规范,满足这些规范后,对比普通的Java类,它能在一些特定的场景来使用。
它的概念总结来说就是:
Java Bean是一种符合特定命名规范和结构的Java类。其主要特征是私有属性,并且这些属性通过getter和setter方法进行访问和修改。Java Bean通常应该包含一个无参构造函数,以便于创建其实例。
此外,根据Java EE的规范,Java Bean需要实现Serializable接口,从而能够将Java Bean对象序列化到文件或通过网络进行传输。这种特性使得Java Bean在很多场合都得到了广泛应用,例如用于存储数据或者在网络上传输数据。
BeansUtils 工具类
- 需要的 jar 包:commons-beanutils.jar、commons-logging.jar
- 类方法
String getProperty(Object bean, String name)
:获取 bean 对象中属性名为 name 的值void setProperty(Object bean, String name, Object value)
:设置 bean 对象中属性名为 name 的值为 valuevoid copyProperties(Object dest, Object orig)
:JavaBean 对象之间属性值的拷贝;或 Map 对象转 JavaBean 对象
Lombok 工具
实际开发中,我们会使用Lombok工具简化代码,使用注解来帮助我们更简洁的编写代码。(我的理解就是注解就是封装好的功能代码,加了注解,编译器就知道该在加了注解的地方添加上什么代码。)
- 通过命令行安装 jar 包,然后在项目中导入 lombok.jar
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
然后就可以使用Lombok的注解帮助开发了。
Lombok 中的常用注解
- val:用在局部变量前,相当于将变量声明为 final
- @NonNull:在方法参数前增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NullPointerException
- @Cleanup:自动管理资源,用在局部变量前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成 try-finally 这样的代码来关闭流
- @Getter、@Setter:用在属性或类上,为属性生成 getter 和 setter 方法
- @EqualsAndHashCode:生成
equals()
方法 和hashCode()
方法 - @ToString:实现
toString()
方法,属性:exclude、callSuper - @Data:相当于同时使用了 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor
- @Value:用在类上,是 @Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter 方法,而不提供 setter 方法
- @Accessors:用在类、字段上(A more fluent API for getters and setters),属性:fluent、chain、prefix,
Widget testWidget = new Widget().id(1).name("foo");
- @Builder:用在类、构造器、方法上,使用构造器创建对象,
Widget testWidget = Widget.builder().id(1).name("foo").build();
,属性:toBuilder = true,Widget newWidget = testWidget.toBuilder().id(2).build();
;@Builder.Default(用在字段上,表示有默认值) - @NoArgsConstructor:生成无参数的构造器
- @AllArgsConstructor
- @RequiredArgsConstructor(staticName = “of”)
- @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,锁对象是一个私有的属性 $lock 或 $LOCK
- @SneakyThrows:自动抛受检异常,而无需显式在方法上使用 throws 语句
- @Slf4j:为类提供一个 属性名为 log 的 SLF4J 日志对象(推荐)
private static final Logger log = LoggerFactory.getLogger(Test.class);
log.error(各类参数或者对象toString() + "_" + e.getMessage(), e);
- @Log4j:为类提供一个 属性名为 log 的 Log4j 日志对象