Bean是什么?

Bean是什么?

Java Bean

在Java里面,Java Bean实际上只是一个规范,比如一个类里面的属性最好为私有private的,最好有无参构造,有getter/setter方法,最好实现Serializable接口(implements Serializable)......

但其实,也只是规范,并不是说必须遵守。

Spring Bean

在 Spring 框架中,"bean" 是一个被 Spring IoC(控制反转)容器管理的对象。以下是关于 Spring bean 的一些关键点:

由 Spring 容器实例化、配置和组装:Spring 容器负责创建 bean 的实例,设置必要的属性(通过依赖注入),并管理它们的完整生命周期。

由注解或 XML 配置定义:bean 可以通过注解(如 @Component、@Service、@Repository、@Controller)或 XML 配置文件定义。将该类标记为Spring容器管理的Bean

单例或原型:Spring 管理的 bean 可以有不同的作用域,如单例(默认,每个 Spring 容器只有一个 bean 实例)、原型(每次请求都会创建一个新的 bean 实例)、请求、会话等。

依赖注入:Spring 通过依赖注入(DI)机制管理 bean 之间的依赖关系,可以是构造函数注入、setter 注入或字段注入。

生命周期管理:Spring 提供了丰富的生命周期回调机制,如 @PostConstruct 和 @PreDestroy 注解,允许在 bean 的生命周期的特定点执行自定义逻辑。

可配置:bean 的行为可以通过配置进行定制,例如,通过 @Bean 注解的方法或 XML 配置文件中的 定义。

可替换:在测试或不同的部署环境中,可以替换 bean 的实现,而不需要修改代码。

支持 AOP:Spring 管理的 bean 可以方便地应用面向切面编程(AOP),例如,通过切面来添加日志记录、事务管理等横切关注点。

可懒加载:bean 可以配置为懒加载,这意味着只有在第一次使用时才创建 bean 实例。

支持自动装配:Spring 可以自动装配 bean 的依赖,减少手动配置的需要。

在 Spring 应用程序中,几乎所有的对象都是 bean,包括服务、数据访问对象(DAO)、控制器、工具类等。通过使用 Spring 框架,开发者可以专注于业务逻辑的实现,而不必关心底层的组件管理,从而提高开发效率和代码质量。

Bean就是类的实例?

Bean在Spring框架中通常指的是由Spring容器管理的类的实例。但是Bean不仅仅是类的实例,更重要的是它必须由Spring的IoC容器管理。因此,仅仅通过new关键字创建的类的实例不是Bean,只有当这个实例被加入到Spring的IoC容器中时,它才成为Bean。

1. Bean的创建过程:

@Component

public class TokenService {

// ...

}

```

等价于:

// 1. 创建实例

TokenService tokenService = new TokenService();

// 2. 放入IOC容器

iocContainer.put("tokenService", tokenService);

```

2. 完整流程:

类路径扫描

Spring 会通过组件扫描(@ComponentScan)机制来扫描指定的包路径,查找带有 @Component(以及 @Service、@Controller、@Repository 等注解的类)。

实例化

默认情况:如果类中定义了无参构造函数,Spring 会通过反射调用无参构造函数来创建实例。

其他情况:如果类中没有显式定义无参构造函数,但有其他构造函数(例如带有参数的构造函数),Spring 会尝试使用这些构造函数。从 Spring 4.3 开始,如果一个类中只有一个构造函数(无论是否带参数),Spring 会自动使用这个构造函数来创建实例。如果类中定义了多个构造函数,可以通过 @Autowired 注解来指定 Spring 使用哪个构造函数。

依赖注入

在创建实例后,Spring 会根据类中的依赖关系(通过 @Autowired 注解或构造函数参数)注入其他 Bean。

初始化

如果类实现了 InitializingBean 接口或定义了 @PostConstruct 注解的方法,Spring 会在实例化和依赖注入完成后调用这些初始化方法。

存储到 IoC 容器

最终,创建好的 Bean 会被存储到 Spring 的 IoC 容器中,供其他组件使用。

3. 区别在于:

- 普通实例:`new TokenService()` 后,实例由我们管理

- Bean:`new TokenService()` 后,实例由Spring的IOC容器管理

4. 举个例子:

// 普通实例

TokenService instance1 = new TokenService(); // 实例由我们管理

// Bean

@Component

public class TokenService {

// ...

}

// Spring容器会:

// 1. new TokenService()

// 2. 将实例放入IOC容器

// 3. 这个实例就成为了Bean

```

所以:

- Bean确实就是类的实例

- 只是这个实例被放入了IOC容器

- 由Spring容器来管理这个实例

- 这就是为什么Bean有那些特殊的特点(单例、依赖注入等)

相关推荐