在javase阶段,我们知道了bean的庞大体系
继承,实现。抽象类,多态之类的
1. 核心概念澄清
你说的对,也不完全对:
- 是的,Bean本质上就是一个Java类的实例(对象)
- 但在Spring中,Bean不仅仅是简单的类实例,它是由SpringIoC容器管理的完整对象
2. 普通Java对象的生命周期
// 普通Java对象publicclassUserService{publicUserService(){// 1. 构造}publicvoidinit(){// 需要手动调用}publicvoiddestroy(){// 需要手动调用}}// 使用方式UserServiceservice=newUserService();// 自己控制创建时机service.init();// 自己控制初始化// 使用...service.destroy();// 自己控制销毁特点:
- 完全由开发者控制生命周期
- 垃圾回收器负责最终清理
- 没有统一的依赖注入
- 没有AOP增强
3. Spring Bean的生命周期
Spring为Bean提供了完整、标准化的生命周期管理:
完整生命周期(简化版):
1. Bean定义加载 → 2. 实例化 → 3. 属性赋值 → 4. BeanNameAware → 5. BeanFactoryAware → 6. ApplicationContextAware → 7. @PostConstruct → 8. InitializingBean → 9. 自定义init方法 → 10. Bean就绪可用 → 11. @PreDestroy → 12. DisposableBean → 13. 自定义destroy方法代码示例:
@ComponentpublicclassUserServiceimplementsBeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{// 1. 构造方法(Spring调用)publicUserService(){System.out.println("1. 实例化");}// 2. 属性注入(Spring自动)@AutowiredprivateUserDaouserDao;// 3. BeanNameAware@OverridepublicvoidsetBeanName(Stringname){System.out.println("3. 设置Bean名称: "+name);}// 4. BeanFactoryAware@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory){System.out.println("4. 设置BeanFactory");}// 5. ApplicationContextAware@OverridepublicvoidsetApplicationContext(ApplicationContextcontext){System.out.println("5. 设置ApplicationContext");}// 6. @PostConstruct@PostConstructpublicvoidpostConstruct(){System.out.println("6. @PostConstruct");}// 7. InitializingBean@OverridepublicvoidafterPropertiesSet(){System.out.println("7. afterPropertiesSet");}// 8. 自定义init方法@Bean(initMethod="customInit")publicvoidcustomInit(){System.out.println("8. 自定义init方法");}// 9. 使用阶段...// 10. @PreDestroy@PreDestroypublicvoidpreDestroy(){System.out.println("10. @PreDestroy");}// 11. DisposableBean@Overridepublicvoiddestroy(){System.out.println("11. DisposableBean.destroy()");}// 12. 自定义destroy方法@Bean(destroyMethod="customDestroy")publicvoidcustomDestroy(){System.out.println("12. 自定义destroy方法");}}4. 关键区别对比
| 方面 | 普通Java对象 | Spring Bean |
|---|---|---|
| 创建控制 | 开发者显式new | Spring容器负责 |
| 依赖注入 | 手动setter/构造器 | 自动注入(@Autowired) |
| 初始化 | 手动调用init方法 | 多种初始化机制 |
| 作用域 | 单一作用域 | 多种作用域(singleton, prototype, request等) |
| AOP增强 | 需要手动实现 | 自动代理,实现横切关注点 |
| 销毁管理 | 依赖GC或手动调用 | 统一生命周期管理 |
| 配置方式 | 硬编码 | 多种配置(XML、注解、JavaConfig) |
5. Spring Bean的特殊能力
A. 依赖注入(DI)
@ComponentpublicclassOrderService{// Spring自动注入依赖@AutowiredprivatePaymentServicepaymentService;@AutowiredprivateUserServiceuserService;}B. AOP代理
@ServicepublicclassProductService{@Transactional// 自动事务管理publicvoidsaveProduct(Productproduct){// 这个方法会被Spring AOP增强}}C. 作用域管理
@Component@Scope("prototype")// 每次获取都是新实例publicclassShoppingCart{// ...}@Component@Scope("singleton")// 默认,单例publicclassConfigService{// ...}D. 条件化创建
@Component@ConditionalOnProperty(name="feature.enabled",havingValue="true")publicclassFeatureService{// 只有配置了feature.enabled=true才创建}6. 实际意义
为什么这种区别重要?
- 控制反转(IoC):应用的控制权从开发者转移到了框架
- 关注点分离:开发者专注于业务逻辑,框架负责基础设施
- 一致性:所有Bean都有标准化的生命周期
- 可扩展性:通过生命周期钩子可以轻松扩展功能
- 测试友好:依赖注入让单元测试更容易
7. 简单比喻
- 普通Java对象:像自己买菜、洗菜、炒菜、洗碗
- Spring Bean:像去餐厅点菜,餐厅负责所有流程管理
总结:Spring Bean确实是一个Java类的实例,但它是被Spring容器赋予了额外能力、按照特定生命周期管理的"增强版"对象。这种管理带来了依赖注入、AOP、统一配置等诸多便利,是现代Java应用开发的重要基石。