`
wisfly
  • 浏览: 61467 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

spring每次getBean(),获得的是否是同一个实例

 
阅读更多

spring每次getBean(),获得的是否是同一个实例

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢! 

spring 缺省:

  • 1.spring用DefaultListableBeanFactory.preInstantiateSingletons()建立bean实例
  • 2.缺省采用单例模式

测试基本bean:

xml配置文件:
<bean id="dvdTypeDAO" class="com.machome.hibernate.impl.DvdTypeDAOImpl" />   
测试代码:
        ctx = new ClassPathXmlApplicationContext("spring-hibernate-mysql.xml");
        DvdTypeDAO tDao1 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO");
        DvdTypeDAO tDao2 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO");
运行:        
true
com.machome.hibernate.impl.DvdTypeDAOImpl@15b0333
com.machome.hibernate.impl.DvdTypeDAOImpl@15b0333

说明前后两次getBean()获得的是同一实例,说明spring缺省是单例



改scope为多实例

<bean id="dvdTypeDAO" class="com.machome.hibernate.impl.DvdTypeDAOImpl" scope="prototype" />
 
执行同样的测试代码
运行:
false
com.machome.hibernate.impl.DvdTypeDAOImpl@afae4a
com.machome.hibernate.impl.DvdTypeDAOImpl@1db9852
说明scope="prototype"后,每次getBean()的都是不同的新实例




使用spring 的时候, 你应该先问问自己,你编一个类,初衷,是否就是准备采用单例? 是否就是准备内部设静态实例,私有化构造方法,静态块初始化,静态getInstance() 方法?
我们可以借鉴一个框架的设计思想和经验,但不要让它帮我们做选择!!!



以此类推,spring 提供给hibernate的SessionFactory是否是单例?
sessionFactory bean 由spring的对应的SessionFactory类建立的bean, 按数据库类型,分为hibernate,JPA等几种,按操作类型,分为专为xml配置文件设计的的和专为标注设计的
sessionFactory bean 尽管是"工厂",但那是指它建立session的功能.它相对于spring来说,仍是一个普通的bean,通常把它作为属性注入到其他需要session的DAO bean中.
所以sessionFactory bean 自身的建立仍采用spring的缺省工厂类,自然缺省也是单例的.

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
            <value>org/machome/hibernate/DvdType.hbm.xml</value>   
        </list>
    </property>  
    <property name="hibernateProperties">                   
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            hibernate.hbm2ddl.auto=update         
        </value>
    </property>
</bean>

<bean id="dvdTypeDAO" class="com.machome.hibernate.impl.DvdTypeDAOImpl">
   <property name="seasonFactory" ref="seasonFactory"/>
</bean>
测试代码:
        ctx = new ClassPathXmlApplicationContext("spring-hibernate-mysql.xml");
        SessionFactory tDao1 = (SessionFactory)ctx.getBean("sessionFactory");
        SessionFactory tDao2 = (SessionFactory)ctx.getBean("sessionFactory");
        
        System.out.println(tDao1==tDao2);
        System.out.println(tDao1);
        System.out.println(tDao2);
运行:
true
org.hibernate.impl.SessionFactoryImpl@12c5431
org.hibernate.impl.SessionFactoryImpl@12c5431



DataSource bean 是否是单例?
DataSource bean通常把它作为属性注入到sessionFactory bean中
它自身仍是普通bean,采用spring的缺省工厂类,自然缺省也是单例的

apacha dbcp(一个 java 连接池项目,也是 tomcat 使用的连接池组件。) datasource

        ctx = new ClassPathXmlApplicationContext("spring-hibernate-mysql.xml");
        BasicDataSource tDao1 = (BasicDataSource)ctx.getBean("dataSource");
        BasicDataSource tDao2 = (BasicDataSource)ctx.getBean("dataSource");
        
        System.out.println(tDao1==tDao2);
        System.out.println(tDao1);
        System.out.println(tDao2);
true
org.apache.commons.dbcp.BasicDataSource@ab7165
org.apache.commons.dbcp.BasicDataSource@ab7165


c3p0(是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。) datasource

        ComboPooledDataSource tDao1 = (ComboPooledDataSource)ctx.getBean("dataSource");
        ComboPooledDataSource tDao2 = (ComboPooledDataSource)ctx.getBean("dataSource");
        
        System.out.println(tDao1==tDao2);
        System.out.println(tDao1);
        System.out.println(tDao2);
true
com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, ... ]

com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, ... ]

 

总结:spring缺省都是单例

 

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

分享到:
评论

相关推荐

    spring中通过ApplicationContext getBean获取注入对象的方法实例

    今天小编就为大家分享一篇关于spring中通过ApplicationContext getBean获取注入对象的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Spring源码分析.pdf

    Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC 容器的实现机制和...

    spring源码解决

    //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 Object getBean(String name) throws BeansException; //这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于...

    JSP 中Spring Bean 的作用域详解

    与singleton相反, 每次通过容器的getBean()方法获取该作用域下的Bean时都将产生一个新的Bean实例 3&gt;request: 对于同一次Http请求,request作用域下的Bean都将只生成一个实例。这种作用域只有在Web应用中使用Spring...

    Spring面试题

    依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色 需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中 ...

    Spring中ApplicationContext加载机制

    这两者在功能上完全等同,只是一个是基于 Servlet2.3 版本中新引入的 Listener 接口实现,而另一个基于 Servlet 接口实现。开发中可根据目标 Web 容器的实际情况进行选择。 配置非常简单,在 web.xml 中增加相应的...

    springmybatis

    请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应() 重写测试代码 程序代码 程序代码 public static void main(String[] args) { SqlSession session = ...

    spring技术入门相关源码

    spring技术入门系列源码 public class SpringTest { public static void main(String[] args) { //创建spring的ApplicationContext ApplicationContext ctx = new ClassPathXmlApplicationContext(...

    spring学习资料

    7. //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 8. Object getBean(String name) throws BeansException; 9. 10. //这里根据bean的名字和Class类型来得到bean实例,...

    spring.xls

    spring的IOC: * IOC:spring容器控制对象的生命周期:前提条件:在spring容器中的bean必须是单例的 * 创建 * 方式 * 利用默认的构造函数,如果没有默认的构造函数,会报错 * 利用静态工厂方法 * 利用实例工厂...

    Spring AOP 动态代理(二)

    代理模式其实很简单 主要包括 接口+真实的实现类+代理类 在真实类的实例化的时候 使用代理类,所以需要 Spring AOP 做的是生成一个代理类,然后替换真实的类 去对外提供服务 那怎么去替换呢? 就是Spring IOC 容器中...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    spring aop 实现源代码--xml and annotation(带lib包)

    在这里,我们分别定义了一个MessageSender对象(messageSenderImpl)和一个Before Advice对象(logBeforeAdvice),并定义了一个 org.springframework.aop.framework.ProxyFactoryBean对象(messageSender),...

    Spring模拟

    Spring模拟,可创建对象和spring ...必须在service定义dao层一个接口,那么该工具将自动在配置的扫描bean中找到该类(接口)的实现类(不必再实现类做任何记号,只需在需要实例化的对象上写个注解就好),并实例化。

    Spring Bean 的生命周期.docx

    Spring的生命周期是指实例化Bean时所经历的一系列阶段,即通过getBean()获取bean对象及设置对象属性时,Spring框架做了哪些事。Bean的生命周期从Spring容器实例化Bean到销毁Bean。 本文分别对 BeanFactory 和 ...

    java查看sun包源码-learning-spring:Spring框架讲解

    BeanFactory:IOC容器的基本实现,在调用getBean()方法时才会实例化对象 ApplicationContext:提供了更多的高级特性,在加载配置文件后就会实例化对象。是BeanFactory的子接口 BeanFactory是Spring框架的基础设施,...

    Spring笔记(第三次)1

    是Pig还是jamesFactoryBean的实例bean呢,调试跟进getBean源码看看(可看第三节课的视频)发现实际是获取getObject创建的对象,

    spring-experiement

    目的 该项目测试了运行静态块和Spring bean初始化的顺序 实验:静态块可以访问自动装配的对象吗?... 由于Spring必须实例化该类(这肯定需要加载该类),然后才能在该实例上调用setter,因此静态初始化程序块已经运行。

    SpringFXExample

    这是通过在FXMLLoader上设置一个控制器工厂来实现的,该控制器工厂委托给bean工厂:本质上,这只是loader.setControllerFactory(applicationContext::getBean) 。 此外,通过在加载程序上设置自定义生成器工厂,...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    由于 FlexService 对象已经被 Spring 管理,因此,我们需要编写一个 FlexFactory 告诉 BlazeDS 如何找到 Spring 管理的 FlexService 的实例。flexFactory 在 services-config.xml 中指定: 清单 8. 定义 ...

Global site tag (gtag.js) - Google Analytics