Spring容器中的Bean

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NameGGG/article/details/78033709

Spring容器中的Bean

1. Bean的创建方式

  • 构造器创建Bean
  • 静态工厂方法创建Bean
  • 实例工厂创建Bean

三种创建Bean的例子


2. Bean的生命周期

2.1 Bean的完整流程

这里写图片描述

bean 工厂执行了若干启动步骤。我们对图1. 5进行详细描述:
1. Spring对bean 进行实例化;
2. Spring将值和bean 的引用注入到bean对应的属性中;
3. 如果bean 实现了BeanNameAware接口,Spring将bean 的I D传递给setBean-Name()方法;
4. 如果bean 实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将Bean Factory 容器实例传入;
5. 如果bean 实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean 所在的应用上下文的引用传入进来;
6. 如果bean 实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
7. 如果bean 实现了org.springframwork.beans.factory.InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地如果bean 在配置文件中指定了init-method属性的初始化方法,该方法也会被调用;
8. 如果bean 实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
9. 此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10. 如果bean 实现了org.springframwork.bean.factory.DisposeableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean 在配置文件中指定了destroy-method属性的销毁方法,该方法也会被调用


3. Bean的作用域

@Scope –指定bean的作用域

  • 说明: 指定bean的作用域
  • 用法:
    • @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) –bean的作用域类型
    • @Scope(“prototype”) –使用SCOPE_PROTOTYPE常量更加安全并且不易出错。
  • 参数
    • Singleton – 单例 ,在整个应用中,只创建bean 的一个实例。(默认)
    • Prototype – 原型, 每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean 实例。
    • Session – 会话 ,在Web应用中,为每个会话创建一个bean 实例。
    • Rquest– 请求 ,在Web应用中,为每个请求创建一个bean 实例。

注意:

  • request和session作用域只在web应用中才生效,并且必须在web应用中增加额外的配置才会生效,为了让request,session两个作用域生效,必须将HTTP请求对象绑定到为该请求提供服务的线程上,这使得具有request和session作用域的Bean实例能够在后面的调用链中被访问。

  • Singleton: Spring可以精确的知道该Bean何时被创建、初始化、销毁。对于singleton作用域的Bean,每次客户端请求 Spring容器总会返回一个共享的实例。
    Prototype: Spring容器仅仅负责创建Bean,当容器创建了Bean的实例后,Bean实例完全交给客户端代码管理,容器不在跟踪其生命周期。每次客户端请求prototype作用域的Bean,都会为他创建一个新的实例,


例:
1.java配置

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)  //类
public class Test {

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //方法
    public DataSource dataSource1(){
        return null;        
    }
}

2.XML配置bean

<bean id="propertyConfigurer"  
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="prototype">                                         
     <property name="location" value="classpath:jdbc.properties" />  
</bean>

番外: Bean作用域详解

猜你喜欢

转载自blog.csdn.net/NameGGG/article/details/78033709