`

Spring学习之从BeanFactory接口开始--Bean的作用域

阅读更多

先看一下BeanFactory接口的三个子接口:

 

 

 

 

 

 

 

 

 

还是很清楚的

 

  • ListableBeanFactory:提供访问容器中bean基本信息的方法
  • AutowireCapableBeanFactory:定义了将容器中的bean按某种方式进行自动装配的方法
  • HierarchicalBeanFactory:提供了访问父容器的方法,这样就使得spring具有父子级联的IOC容器
看一下BeanFactory定义的方法

在BeanFactory中的方法,很普通,但是需要特别注意的是isPrototype,isSingleton这两个方法,因为这涉及到Bean的作用域的概念。

在isSingleton方法注释中是这样描述的
 写道
Is this bean a shared singleton? That is, will getBean always return the same instance?

Note: This method returning false does not clearly indicate independent instances. It indicates non-singleton instances, which may correspond to a scoped bean as well. Use the isPrototype operation to explicitly check for independent instances.
 
既然Spring在如此核心的BeanFactory中已经涉及到singleton等概念了,那顺便复习一下。

singleton模式,是设计模式中的一种,中文名为单例模式,顾名思义,单例模式在实例化一次后每次只返回原有的那一份。这在数据库连接,一些共享,无状态的对象上非常有用,避免了每次实例化带来的开销。

核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定

关于singleton的概念,可以通过以下的代码来大致表现出来(代码为网上搜索得来^_^):
public class HelloBean {

    private String helloWorld;

    private int i = (int) (100 * Math.random());

    public HelloBean(String helloWorld) {
        this.helloWorld = helloWorld;
    }

    public void sayHello() {
        System.out.println(helloWorld);
        System.out.println("输出随机整数:  " + i);
    }
}
 <beans>
    <bean id="singletonBean" class="javamxj.spring.basic.singleton.HelloBean">
        <constructor-arg>
            <value>Hello! 这是singletonBean!value>
        </constructor-arg>
   </ bean>

    <bean id="prototypeBean" class="javamxj.spring.basic.singleton.HelloBean"
        singleton="false">
        <constructor-arg>
            <value>Hello! 这是prototypeBean! value>
        </constructor-arg>
    </bean>

</beans>

 public class Main {

    public static void main(String[] args) {

        Resource res = new ClassPathResource("javamxj/spring/basic/singleton/bean.xml");
        BeanFactory factory = new XmlBeanFactory(res);

        HelloBean h1 = (HelloBean) factory.getBean("singletonBean");
        h1.sayHello();        
        
        HelloBean h2 = (HelloBean) factory.getBean("singletonBean");
        h2.sayHello();
        
        System.out.println("h1==h2: " + (h1==h2));
        System.out.println("");
        
        
        HelloBean h3 = (HelloBean) factory.getBean("prototypeBean");
        h3.sayHello();
        
        HelloBean h4 = (HelloBean) factory.getBean("prototypeBean");
        h4.sayHello();
        
        System.out.println("h3==h4: " + (h3==h4));
    }
}

 运行结果为:

 

Hello! 这是singletonBean!
输出随机整数:  7
Hello! 这是singletonBean!
输出随机整数:  7
h1==h2: true
 
Hello! 这是prototypeBean! 
输出随机整数:  95
Hello! 这是prototypeBean! 
输出随机整数:  60
h3==h4: false

核心提示:Spring通过某些机制,保证了在其容器下的bean默认均为singleton,也就是说使用者无需自己维护一个singleton方法。

除了singleton作用域外,spring还有prototype,request,session,globalSession几个作用域,这些我在其他文章中再写!

总结一下:
  • BeanFactory本质是一个工厂,创建Bean的工厂(涉及到工厂模式)
  • 部分设计模式在Spring中有着非常重要的应用
  • 大小: 8.6 KB
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    tiny-spring-step-4-config-beanfactory-with-xml.zip

    BeanFactory是Spring中最基本的IOC容器接口,它负责管理Bean的生命周期,包括实例化、初始化、销毁等操作。在实际应用中,我们通常使用其子类ApplicationContext,它提供了更丰富的功能,如国际化支持、事件发布等。...

    spring-aware接口实现与bean作用域(spring多容器层面)

    在Spring框架中,`Spring-Aware`接口是一个重要的概念,它允许我们与Spring的应用上下文(ApplicationContext...通过正确地配置和使用`Spring-Aware`接口以及理解Bean的作用域,可以有效地在这些模块间共享和协同工作。

    二、Spring源码分析——BeanFactory

    4. **作用域管理**:支持单例(singleton)、原型(prototype)等多种bean的作用域。 5. **配置元数据**:可以读取XML、注解或基于Java的配置来管理bean。 三、BeanFactory与ApplicationContext的区别 虽然...

    Spring的BeanFactory的接口注解

    ### Spring的BeanFactory的接口注解 #### 一、引言 在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心...

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    简单模拟Spring的beanFactory

    在实际的Spring框架中,`BeanFactory`接口提供了许多方法,如`getBean()`用于获取bean,`containsBean()`检查是否存在特定bean等。 首先,我们要了解`BeanFactory`的工作流程。这个过程通常包括以下步骤: 1. **...

    Spring中与Bean相关的接口

    Spring还允许我们自定义Bean的作用域。默认情况下,Bean是单例(Singleton),但在`@Scope`注解的帮助下,我们可以创建原型(Prototype)、会话(Session)或请求(Request)作用域的Bean。 最后,`...

    spring-developing-java-applications-enterprise

    - **Spring Core Container**:包括了BeanFactory和ApplicationContext两个核心接口,它们是Spring IoC容器的基础。 - **BeanFactory**:是最基本的容器,提供了配置和管理bean的能力。 - **ApplicationContext**...

    Spring学习笔记+学习源码.zip

    - Bean的生命周期和作用域 - XML与注解配置的区别与使用 - AOP的原理与应用 - Spring MVC的流程和配置 - 数据库连接池的配置和使用 - 事务管理的实现 - Spring Boot的快速开发特性 - Spring Security的基本配置和...

    Spring 源码分析文档----自用

    在Spring中,通过配置Bean的作用域为`prototype`可以实现原型模式。 5. **代理模式** - **应用场景**:Spring AOP中广泛使用了代理模式来实现切面编程。例如,`JdkDynamicAopProxy`和`Cglib2AopProxy`分别利用JDK...

    Spring bean 管理

    在Spring中,Bean的管理包含多个方面:创建Bean实例、配置Bean属性、控制Bean的生命周期以及Bean作用域的定义。接下来将详细解释这些知识点。 1. Spring的工厂类: Spring通过工厂模式设计了一系列工厂类来创建对象...

    撸一撸Spring Framework-IoC-BeanDefinition(csdn)————程序.pdf

    它解析`&lt;bean&gt;`标签,从中提取出`class`属性(定义bean的实现类)、`parent`属性(定义父bean)、以及其他的属性,如`scope`(作用域)、`abstract`(是否为抽象bean)、`lazy-init`(是否延迟初始化)、`autowire`...

    BeanFactory内部解析:Spring框架的心脏如何运作

    总的来说,可以初步理解BeanFactory 为 Spring 框架中负责管理 bean 对象的核心组件,它通过 IoC 容器、延迟加载、依赖注入和作用域管理等机制,实现了对象之间的解耦和灵活配置,从而提高了应用程序的可维护性、可...

    Spring之核心容器bean

    BeanFactory是Spring的基础容器,它提供bean的实例化、作用域、依赖注入、生命周期管理等功能。ApplicationContext则是在BeanFactory基础上扩展,增加了更多企业级服务,如消息处理、国际化、应用事件等。 **Bean的...

    spring学习之路(黑马课程笔记)

    Spring学习之路(黑马课程...Spring学习之路是指通过学习Spring框架来掌握IOC反转控制的关键技术,并且学习Bean的创建和管理、Bean的作用域、Bean的实例化方式、Bean的延迟加载、Bean的初始化函数和销毁函数等知识点。

    spring-core.pdf

    ##### 1.5 Bean作用域 - **1.5.1 单例作用域**: 默认情况下,每个Bean都是单例的,即在容器中只有一个实例。 - **1.5.2 原型作用域**: 对于每次请求都创建一个新的实例,适用于那些不希望共享的状态Bean。 - **...

    Spring5.1中文参考指南.pdf

    - **Bean作用域**:Spring支持不同的Bean作用域,如singleton、prototype等。 - **自定义Bean**:如何创建和配置自定义Bean的方法。 - **Bean的继承**:Bean可以继承另一个Bean的配置。 - **容器扩展点**:提供...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    但是,Spring 框架中不能解决非单例属性之外的循环依赖、构造器的循环依赖和prototype 作用域循环依赖。 在 Spring 框架中,Bean 的生命周期是一个重要的概念。Bean 的生命周期流程包括实例化、依赖注入、初始化、...

    spring源码合集spring源码合集

    理解这一过程有助于我们优化应用的初始化性能,合理设计Bean的加载顺序,以及更好地处理不同作用域的Bean。 4. **MyBatis源码解析**:尽管"19-MyBatis源码—SQL操作执行流程源码深度剖析-徐庶"和"12-Spring之整合...

Global site tag (gtag.js) - Google Analytics