Spring中Bean的细节

Spring框架中Bean的创建方式与作用域解析
本文详细介绍了在Spring框架中创建Bean的三种方式:默认构造函数、工厂方法(普通工厂和静态工厂)。同时,阐述了Bean的作用域,包括singleton(单例)和prototype(多例),以及它们在实际应用中的选择依据。此外,还讨论了单例和多例Bean的生命周期,并解释了为何在特定场景下选择单例或多例模式。

三种创建Bean对象的方式

第一种方式:适用默认构造函数创建

在Spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时,采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

第二种方式:使用普通工厂中的方法创建对对象(使用某个类中的方法创建对象并存入spring容器)

第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象并存入spring容器中)

<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>

Bean的作用范围

Spring中创建的Bean对象默认情况下就是单例的,那么如何去调整??

bean标签中有一个scope属性,用于指定bean的作用范围,其取值可以使:

1、singleton:单例,默认值

2、prototype:多例

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="prototype"></bean>

3、request:作用于web应用的请求范围

4、session:作用于web应用的会话范围

5、global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境的时候,它就是session

常用的值其实就是singleton和prototype。

为什么用单例、多例????

之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;

用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例。

Bean对象的生命周期

单例对象

出生:当容器创建时对象出生

活着:只要容器还在,对象就一直活着

死亡:容器销毁,对象消亡

多例对象

出生:当使用对象的时候spring框架会创建

活着:对象只要在使用过程中就一直活着

死亡:当对象长时间不用且没有别的对象引用时候,由Java 的垃圾回收器回收

### Spring Bean容器的作用 Spring Bean容器是Spring框架的核心组件之一,主要负责管理Bean的生命周期、依赖注入以及配置。其作用可以概括为以下几个方面: 1. **Bean的实例化与管理** Spring Bean容器通过读取配置文件(如XML或Java配置类)或注解来创建和管理Bean的实例。这些Bean的类名、作用域、依赖关系等信息会被解析,并根据定义的规则进行实例化[^2]。程序只需要获取`BeanFactory`的引用,即可通过`getBean(String beanId)`方法获取容器中管理的Bean实例,而无需直接参与对象的创建过程[^3]。 2. **依赖注入(DI)** Spring Bean容器能够自动处理Bean之间的依赖关系。当某个Bean需要依赖其他Bean时,容器会自动将所需的依赖注入到该Bean中,从而实现松耦合的设计。这种机制简化了对象之间的关联管理,并提高了代码的可测试性和可维护性。 3. **生命周期管理** 容器不仅负责Bean的创建,还管理Bean的整个生命周期。包括初始化、使用和销毁阶段。例如,在Bean初始化过程中,容器可以通过后处理器(如`InstantiationAwareBeanPostProcessor`和`BeanPostProcessor`接口)对Bean进行额外的处理,确保Bean在被使用前已经处于正确的状态[^4]。 4. **作用域管理** Spring Bean容器支持多种作用域(Scope),如Singleton、Prototype、Request、Session和GlobalSession等。不同的作用域决定了Bean的生命周期和可见范围。例如,Singleton作用域的Bean在整个应用中只有一个实例,而Prototype作用域的Bean每次请求都会创建一个新的实例[^5]。 5. **配置与解耦** 通过Spring Bean容器,应用程序的配置与实现细节可以分离。开发者只需关注如何定义Bean及其依赖关系,而不需要关心具体的实例化和管理逻辑。这种方式有效地降低了代码之间的耦合度,使得系统更加灵活且易于扩展[^3]。 6. **扩展性与插件化** Spring Bean容器提供了丰富的扩展点,允许开发者通过自定义后处理器、监听器等方式对容器的行为进行定制。例如,通过实现`BeanPostProcessor`接口,可以在Bean的初始化前后执行特定的逻辑,从而增强容器的功能[^4]。 综上所述,Spring Bean容器不仅是Spring框架的基础,也是构建现代企业级应用的重要工具。它通过集中管理Bean的生命周期、依赖关系和配置,极大地简化了复杂系统的开发与维护。 ```java // 示例:通过BeanFactory获取Bean实例 BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); MyBean myBean = (MyBean) factory.getBean("myBean"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值