Spring Bean管理

本文深入探讨Spring框架中Bean的管理机制,包括ApplicationContext与BeanFactory的区别、Bean的实例化方式、配置方法、作用域、生命周期及属性注入。同时,介绍了使用注解进行Bean配置的方法,以及如何整合XML与注解配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Bean管理

Spring的工厂类

ApplicationContext和BeanFactory的区别

  • ApplicationContext多了国际化等操作;
  • 生成bean实例的时机不一样:
    1. BeanFactory:在工厂实例化之后,调用getBean()方法的时候创建这个类的实例;
    2. ApplicationContext:一加载配置文件的时候,就会将配置文件中所有单例模式生成的类全部实例化。

三种实例化Bean的方式

  1. 使用类构造器实例化(默认无参数,一般选择这种)
  2. 使用静态工厂方法实例化(简单工厂模式)
  3. 使用实例工厂方法实例化(工厂方法模式)

Bean的配置

  • id和name
    • 一般情况下,装配一个Bean时,通过制定一个id属性作为Bean的名称
    • id属性在IOC容器中必须是唯一
    • 如果Bean的名称中含有特殊字符,就需要使用name属性(id和name一样,name里可以包含特殊字符,id不行)
  • class
    • class用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
  • Bean的作用域(Scope属性)
    1. Singleton:在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在;
    2. prototype:每次调用getBean()时都会返回一个新的实例,创建的对象是多例的(整合Struts2的时候用到,Action是多例的,要交给Spring管理,就需要把Action配置成prototype)
    3. request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境;
    4. session:同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境

Spring容器中Bean的生命周期

  • Spring初始化Bean或销毁Bean时,有时候需要做一些处理工作,因此Spring可以在创建和销毁Bean的时候调用Bean的两个生命周期方法。(init-method=“任意指定”,destory-method=“任意指定,scope=singleton才有效”,Bean里要提供)

Spring容器中Bean的生命周期(完整过程)

  1. instantiate:bean对象实例化
  2. populate properties: 封装属性
  3. 如果Bean实现了BeanNameAware,执行setBeanName;(获得在Spring配置文件中的id或者name属性的值)
  4. 如果Bean实现BeanFactoryAware或者ApplicationContextAware,设置工厂setBeanFactory或者上下文对象setApplicationContext;
  5. **(重要)**如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization;
  6. 如果Bean实现InitializingBean,执行afterPropertiesSet;
  7. 调用<bean init-method="init">,指定初始化方法init;
  8. **(重要)**如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization;
  9. 执行业务处理;
  10. 如果Bean实现DisposableBean,执行destroy;
  11. 调用<bean destroy-method="customerDestroy">,指定销毁方法customerDestroy;
  • 后处理Bean的作用:在整个类的生成过程中要执行的一个步骤。在不修改源代码的前提下可以对类进行增强。(涉及到AOP)产生代理对象。
  • 在Spring中,假设某个bean要使用某种类型的资源,那么一般情况下应该把资源的释放到bean的生命周期中销毁阶段;

Spring的属性注入(DI)

  • 对于类成员变量,注入方式有三种:
    1. 构造函数注入;
      • 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用
      • 构造器注入在<constructor-arg>元素里声明的属性
      • 普通类型的值使用value,对象类型的值使用ref
    2. 属性setter方法注入;
      • 使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性
      • 普通类型的值使用value,对象类型的值使用ref
    3. 接口注入
    4. p名称空间
      • 使用p命名空间
      • 为了简化xml文件配置,Spring从2.5开始引入一个新的p名称空间
      • p:<属性名>=“xxx” 引入常量值
      • p:<属性名>-ref=“xxx” 引入其他Bean对象
    5. SpEL属性注入
      • SpEL:spring expression language,Spring表达式语言,对依赖注入进行简化
      • 语法:#{表达式}
      • <bean id="" value="#{表达式}">
      • SpEL表达式语言:
        • 1.#{‘hello’}:使用字符串;
        • 2.#{beanId}:使用另一个bean;
        • 3.#{beanId.content.toUpperCase()}:使用指定名属性,并使用方法;
        • 4.#{T(java.lang.Math).PI}:使用静态字段或方法
    6. 复杂类型的属性注入
      1. 数组类型的属性注入:<list>
      2. List集合类型的属性注入:<list>
      3. Set集合类型的属性注入:<set>
      4. Map集合类型的属性注入:<map><entry key="" value=""></map>
      5. Properties类型的属性注入:<props><prop key="">value</prop></props>
      • 用以整合其他框架的时候使用
      • Spring支持前两种

Spring的Bean管理(注解方式)

  • Spring2.5引入使用注解来定义Bean
    • @Component:描述Spring框架中Bean
  • 除了@Component外,Spring提供了3个功能基本和@Component等效的注解
    • @Repository:用于对DAO实现类进行标注;
    • @Service:用于对Service实现类进行标注;
    • @Controller:用于对Controller实现类进行标注;
  • 这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强

Spring的属性注入-注解方式

  • 使用@Autowired进行自动注入
  • @Autowired默认按照类型进行注入
    • 如果存在两个相同Bean类型相同,则按照名称注入
  • @Autowired注入时可以针对成员变量或者set方法
  • 通过@Autowired的required属性,设置成一定要找到匹配的Bean
  • 使用@Qualifier指定注入Bean的名称
  • 使用Qualifier指定Bean名称后,注解Bean必须指定相同名称
  • Spring提供对JSR-250中定义@Resource标准注解的支持
  • @Resource和@Autowired注解功能相似,但是要指定相同名称

###Spring的其他注解

  • Spring初始化bean或销毁bean时,有时需要做一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法(init-method&destroy-method)
    • @PostConstruct:初始化(当bean被载入到容器的时候调用init)
    • @PreDestroy:销毁(scope=singleton时有效)(当bean从容器中删除的时候调用destroy)
  • Bean的作用范围
    • 使用注解配置的Bean和配置的一样,默认作用范围都是singleton
    • @Scope注解用于指定Bean的作用范围

传统XML配置和注解配置混合使用

  • XML方式的优势
    • 结构清晰,易于阅读
  • 注解方式的优势
    • 开发便捷,属性注入方便
  • XML与注解的整合开发
    1. 引入context命名空间
    2. 在配置文件中添加context:annotation-config标签
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值