Spring Boot中为何使用Bean?自定义对象与Bean有何区别?
为什么要用Spring Bean而非自行创建对象?
你觉得Bean代码多、上手麻烦是因为只看到了表层操作,Spring Bean和你自己new出来的对象,核心区别在于Spring容器的托管能力——这才是Spring框架的核心价值所在。
1. 生命周期全由容器掌控
- 自己
new的对象,从创建到被JVM回收,全程没有自定义干预的入口。比如你想在对象初始化后自动加载配置、销毁前关闭资源,只能手动写代码硬耦合到业务逻辑里。 - Spring Bean的生命周期完全由容器管理:用
@PostConstruct标记初始化逻辑、@PreDestroy标记销毁逻辑,甚至可以通过实现InitializingBean、DisposableBean接口做更复杂的扩展,不用你手动调用这些方法。
2. 依赖注入自动解决依赖嵌套问题
- 自己
new对象时,如果对象A依赖对象B,B又依赖C,你得手动new C()→new B(c)→new A(b),层级一多就会陷入「对象嵌套地狱」,代码臃肿且维护成本极高。 - Spring Bean会自动完成依赖注入:你只需要用
@Autowired或者构造器注入标记依赖,容器会自动找到对应的Bean实例并注入,不用手动处理任何依赖关系,代码简洁度提升不止一个档次。
3. 作用域灵活配置,不用自己写单例逻辑
- 自己
new的对象每次都是新实例,要是想实现全局单例(比如配置类、工具类),得自己写单例模式,还要考虑线程安全、双重校验锁这些细节,容易出错。 - Spring Bean可以通过
@Scope直接指定作用域:默认是singleton(全局单例),还支持prototype(每次获取新实例)、request(每个请求一个实例)等,容器帮你搞定所有实现细节,不用自己造轮子。
4. 是AOP等高级特性的基础
- 自己
new的对象没法直接使用Spring的AOP功能(比如全局日志、事务控制、权限拦截),因为AOP是基于容器对Bean的动态代理实现的。 - Spring Bean会被容器自动生成代理对象,不用修改业务代码就能给方法添加通用逻辑,这是手动创建对象完全做不到的。
关于「额外学习成本」的补充
你觉得要学ApplicationContext、getBean很麻烦,但实际开发中很少直接调用getBean,更多是用依赖注入(比如构造器注入)来获取Bean。ApplicationContext是容器的核心,初期可以先不用深究,先掌握@Component、@Service、@Autowired这些基础注解,随着项目经验积累自然会理解它的作用。
刚开始觉得Bean繁琐很正常,但当项目规模变大、业务逻辑变复杂时,Spring Bean带来的可维护性、扩展性、复用性,是手动创建对象完全无法比拟的。
内容的提问来源于stack exchange,提问作者RandomUser
相关产品推荐
相关产品推荐

