Java Bean 是一种符合特定规范的 Java 类,主要用于封装数据。
它是 Java 开发中的基础概念,特别是在 Spring 框架中广泛应用。
1. Java Bean 的基本规范
一个标准的 Java Bean 需要满足以下条件:
1.1 基本要求
java
// 标准的 Java Bean 示例
public class User implements Serializable {
// 1. 属性私有化
private Long id;
private String name;
private Integer age;
private Boolean active;
// 2. 必须有无参构造函数
public User() {
// 默认构造函数
}
// 3. 可以有有参构造函数(但不是必须)
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
// 4. 为每个属性提供公共的getter和setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// Boolean类型的getter可以是isXxx()或getXxx()
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
// 5. 可选:重写toString(), equals(), hashCode()方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", active=" + active +
'}';
}
}
2. Java Bean 的核心特性
2.1 封装性
java
public class Product {
private String name;
private BigDecimal price;
// 通过getter/setter控制访问,可以添加业务逻辑
public void setPrice(BigDecimal price) {
if (price.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("价格不能为负数");
}
this.price = price;
}
public BigDecimal getPrice() {
// 可以格式化或处理后再返回
return price.setScale(2, RoundingMode.HALF_UP);
}
}
2.2 可序列化(可选但常见)
java
// 实现Serializable接口,支持网络传输和持久化
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
// ...
}
3. Java Bean 在 Spring 中的应用
3.1 作为配置类
java
@Configuration
public class AppConfig {
// @Bean 注解的方法创建 Spring Bean
@Bean
public UserService userService() {
return new UserServiceImpl();
}
@Bean
public DataSource dataSource() {
// 创建并配置数据源
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
}
3.2 作为实体类(JPA/Hibernate)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false)
private String name;
// 必须有无参构造函数
public User() {}
// getter 和 setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
3.3 作为 DTO(数据传输对象)
// 用于API请求和响应的Java Bean
public class UserDTO {
private String username;
private String email;
private Integer age;
// 无参构造函数
public UserDTO() {}
// getter和setter
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
// 在Controller中使用
@RestController
public class UserController {
@PostMapping("/users")
public UserDTO createUser(@RequestBody UserDTO userDTO) {
// Spring自动将JSON映射到UserDTO对象
return userService.createUser(userDTO);
}
}
4. 不同类型的 Java Bean
4.1 业务 Bean(Service Layer)
java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// 业务方法
public User createUser(User user) {
// 业务逻辑
validateUser(user);
return userRepository.save(user);
}
private void validateUser(User user) {
if (user.getName() == null || user.getName().trim().isEmpty()) {
throw new IllegalArgumentException("用户名不能为空");
}
}
}
4.2 配置属性 Bean
// 配置属性映射
@Configuration
@ConfigurationProperties(prefix = "app.database")
public class DatabaseProperties {
private String url;
private String username;
private String password;
private Integer poolSize;
// getter和setter
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
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; }
public Integer getPoolSize() { return poolSize; }
public void setPoolSize(Integer poolSize) { this.poolSize = poolSize; }
}
// application.yml
app:
database:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
pool-size: 10
5. 创建 Java Bean 的方式
5.1 构造器方式
User user = new User();
user.setName("张三");
user.setAge(25);
5.2 Builder 模式(推荐用于复杂对象)
public class User {
private Long id;
private String name;
private Integer age;
// 私有构造器
private User(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
}
// Builder 类
public static class Builder {
private Long id;
private String name;
private Integer age;
public Builder id(Long id) {
this.id = id;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(Integer age) {
this.age = age;
return this;
}
public User build() {
return new User(this);
}
}
// getter 方法...
}
// 使用
User user = new User.Builder()
.id(1L)
.name("张三")
.age(25)
.build();
5.3 使用 Lombok 简化(现代开发推荐)
java
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
private Long id;
private String name;
private Integer age;
private Boolean active;
}
// Lombok 自动生成:
// - 无参构造器
// - 全参构造器
// - getter/setter
// - toString, equals, hashCode
// - Builder 模式
// 使用
User user = User.builder()
.id(1L)
.name("张三")
.age(25)
.active(true)
.build();
6. Java Bean 的最佳实践
6.1 良好的设计
java
// ✅ 好的实践
public class GoodUserBean {
// 使用包装类型,可以表示null
private Long id;
private String name;
private Integer age; // 而不是 int
// 集合初始化
private List<String> roles = new ArrayList<>();
// 提供完整的getter/setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
// 业务逻辑方法
public boolean isAdult() {
return age != null && age >= 18;
}
}
6.2 避免的陷阱
java
// ❌ 不好的实践
public class BadUserBean {
// 使用基本类型,不能表示数据库NULL
private long id; // 应该用 Long
private int age; // 应该用 Integer
// 集合未初始化
private List<String> roles; // 可能为null
// 缺少无参构造器
public BadUserBean(String name) {
// ...
}
// 缺少getter/setter
// ...
}
7. Spring 中的 Bean 生命周期
7.1 Bean 的创建和管理
@Component
public class ExampleBean implements InitializingBean, DisposableBean {
@PostConstruct
public void init() {
System.out.println("Bean初始化完成");
}
@PreDestroy
public void cleanup() {
System.out.println("Bean销毁前清理");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("属性设置完成后调用");
}
@Override
public void destroy() throws Exception {
System.out.println("Bean销毁时调用");
}
}
总结
Java Bean 的核心要点:
✅ 标准规范:无参构造器 + 私有属性 + getter/setter
✅ 封装性:通过方法控制属性访问,可添加业务逻辑
✅ 通用性:适用于各种场景(实体、DTO、配置等)
✅ 框架支持:Spring、JPA、序列化等都基于 Java Bean
在 Spring 中的特殊含义:
Java Bean:符合特定规范的 Java 类
Spring Bean:由 Spring IoC 容器管理的对象实例
掌握 Java Bean 的概念和规范,是理解 Spring 框架和现代 Java 开发的基础!
09-14
1590
1590
11-19
749
749

被折叠的 条评论
为什么被折叠?



