`

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
分享到:
评论

相关推荐

    SpringFramework常见知识点.md

    - bean的作用域有哪些? - Spring 的扩展点主要有哪些? - Spring如何解决循环依赖? - 事务的传播行为是什么?有哪些? - 什么是AOP? - AOP的组成元素和概念有哪些? - AOP实现方式有哪些? - AspectJ AOP 和 ...

    深入解析Spring核心API: 打造高效Java应用

    BeanDefinition则详细描述了bean的配置信息,如类名、作用域、依赖等,为Bean的创建和管理提供了蓝图。 除此之外,文档还深入介绍了Spring的事务管理能力,特别是DataSourceTransactionManager,它为数据库操作提供...

    tiny-spring:tiny-spring是简化版的spring框架,能帮助您快速熟悉spring原型和掌握spring的核心原理。摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能

    摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能。 如果本项目能帮助到你,请给个STAR,谢谢...

    25个经典的Spring面试问答

    Spring Bean的作用域之间有什么区别 什么是Spring inner beans Spring框架中的单例Beans是线程安全的么 请举例说明如何在Spring中注入一个Java Collection 如何向Spring Bean中注入一个JavautilProperties 请解释...

    Spring中文帮助文档

    2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. ...

    Spring API

    2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. ...

    Spring面试题含答案.pdf

    25. 解释 Spring 支持的几种 bean 的作用域 26. Spring 框架中的单例 bean 是线程安全的吗? 27. 解释 Spring 框架中 bean 的生命周期 28. 哪些是重要的 bean 生命周期方法? 你能重载它们吗? 29. 什么是 Spring ...

    Spring面试专题.pdf

    11、Spring Bean 的作用域之间有什么区别? 12、什么是 Spring inner beans? 13、Spring 框架中的单例 Beans 是线程安全的么? 14、请举例说明如何在 Spring 中注入一个 Java Collection? 15、如何向 Spring Bean ...

    Spring面试题.zip

    11、Spring Bean 的作用域之间有什么区别? 12、什么是 Spring inner beans? 13、Spring 框架中的单例 Beans 是线程安全的么? 14、请举例说明如何在 Spring 中注入一个 Java Collection? 15、如何向 Spring Bean ...

    Spring.3.x企业应用开发实战(完整版).part2

    4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命...

    Spring3.x企业应用开发实战(完整版) part1

    4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命...

    Spring3ProjectScopePrototype

    Spring3ProjectScopePrototype Spring 3 + IOC(核心容器)+ Scope(原型),示例由于作用域是原型,因此在这种情况下,如果您多次调用getBean方法,则容器仅将多个对象引用发送到JVM,并会创建多个对象使用...

    低清版 大型门户网站是这样炼成的.pdf

    6.2.4 bean的作用域与生命周期 374 6.2.5 基于xml方式的bean装配 376 6.2.6 基于annotation方式的bean装配 381 6.2.7 基于xml方式的aop实现 386 6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics