Spring中Bean的细节

本文详细介绍了Spring Boot中bean的三种创建方式:构造函数、工厂方法和静态工厂,以及bean的作用范围(singleton、prototype)。实例演示了如何配置不同作用域,并探讨了单例和多例对象的生命周期。

一、创建bean的三种方式

<!--第一种方式 使用构造函数创建     -->
    使用bean 标签 配上 id class属性且没有其他属性时 采用的就是默认构造函数创建bean对象
    此时类中如果没有默认构造函数则无法创建
    <bean id="accountService" class="com.rpf.service.impl.AccountServiceImpl"></bean>

service实现类

  public class AccountServiceImpl implements AccountService {
    public void  saveAccount(){
        System.out.println("service 中的save执行了");
    }
    }

测试

     //1.获取核心容器对象
       ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        AccountService as = (IAccountService)ac.getBean("accountService");
         as.saveAccount();
    }

在这里插入图片描述
第二种方式:如果某个类在别人写的jar包中 无法通过修改源代码 使用默认构造函数时

 <!--bean.xml 第二种方式 使用某个类中的方法创建对象 并存入spring容器-->
    <bean id="InstanceFactory" class="com.rpf.factory.InstanceFactory"></bean>
    <bean id="accountService" factory-bean="InstanceFactory" factory-method="getAccountService"></bean>

创建一个工厂类模拟jar包中的代码

/**
 * 模拟一个工厂类 该类可能是存在jar包中 无法修改源码来提供默认构造函数
 * 这是一个新建的类
 */
public class InstanceFactory {
  public AccountService getAccountService(){
      return new AccountServiceImpl();
  }
}

测试


     //1.获取核心容器对象
       ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        AccountService as = (AccountService)ac.getBean("accountService");
         as.saveAccount();
    }

在这里插入图片描述
第三种使用工厂中的静态方法
工厂中静态方法类

public class StaticFactory {
  public static AccountService getAccountService(){
      return new AccountServiceImpl();
  }
}

bean.xml配置

   <!--第三种方式 使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象并存入spring容器)    -->
    <bean id="accountService" class="com.rpf.factory.StaticFactory" factory-method="getAccountService"></bean>

测试

     //1.获取核心容器对象
       ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        AccountService as = (AccountService)ac.getBean("accountService");
         as.saveAccount();
    }

二、bean的作用范围

bean的scope属性
作用 指定bean的作用范围
取值:singleton:单例(默认值)   每次获取的都是同一个对象   只会创建一个对象
      prototype:多例的       每次从容器get的时候都会产生一个新对象
      request:作用于web应用的请求范围  
      session:作用于web应用的会话范围
      global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时 就是session
  <bean id="accountService" class="com.rpf.service.impl.AccountServiceImpl" scope="prototype"></bean>

测试多例模式 (原型模式)

  ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        AccountService as1 = (AccountService)ac.getBean("accountService");
        AccountService as2 = (AccountService)ac.getBean("accountService");
         System.out.println(as1==as2);

在这里插入图片描述

三、bean的生命周期

在service实现类中加入两个测试方法

 public void  init(){
      System.out.println("对象初始化了");
   }
   public void  destory(){
       System.out.println("对象销毁了");
   }

bean中的配置

 <!--bean对象的生命周期
       单例对象
       出生:当容器创建时对象出生
       活着:只要容器还在对象一直活着
       死亡:容器销毁对象消亡
       总结:单例对象的生命周期和容器相同
       多例对象
       出生:当我们使用对象是spring为我们创建
       活着:对象只要是在使用过程中就一直活着
       死亡:当对象长时间不用,且没有别的对象引用时,又java垃圾回收机制回收 -->

    <bean id="accountService" class="com.rpf.service.impl.AccountServiceImpl" scope="singleton" init-method="init" destroy-method="destory"></bean>

测试单例生命周期 和容器相同

 public static void main(String[] args) {
        //1.获取核心容器对象
       // ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");   
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        AccountService as1 = (AccountService)ac.getBean("accountService");
        //手动关闭容器
        ac.close();
    }
}

在这里插入图片描述

### 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"); ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值