zoukankan      html  css  js  c++  java
  • bean scope的实际应用

    创建s05,进行基本配置,创建dao包,包下创建UserDao类。UserDao只添加默认构造方法
    IoC容器中实例化名为userDao的对象。不添加scope默认为单例singleton。单例模式有一个典型特点就是,对于当前的bean来说是在IoC容器初始化的时候,就会将对象创建。
    scope设置为prototype多例模式。创建对象的时机并不在IoC容器初始化的时候,在获取bean的时候才会创建
    <bean id="userDao" class="com.imooc.spring.ioc.dao.UserDao" scope="prototype">
    
        </bean>
    
        <bean id="userService" class="com.imooc.spring.ioc.service.UserService">
            <property name="userDao" ref="userDao"/>
        </bean>
    IoC容器初始化的时候会产生两个,第五行scope默认的是单例模式,所以会创建一个userService对象,第二个是第六行引用了userDao,而userDao在初始化的过程中是不存在的,所以IoC容器也同样进行了userDao的实例化。先userService再userDao 

    实际项目中,Dao、Service这些具体的类,到底是应该单例还是多例?
    在绝大多数场景下Dao、Service乃至于MVC的Controller控制器类都是单例的。之所以单例会出现线程安全问题,是因为作为某一个对象它的内置的属性,在运行过程中会被不断地变化。根源是属性在运行时不断地发生变化。但是放在具体的环境中,一旦userService对象被创建,也就意味着userDao是哪个具体的类也就确定了,在绝大多数情况下我们并不会对userDao这个属性进行重新的设置,这也就意味着userDao在userService中是一个稳定的不变的。所以作为userService去引用userDao,我们将这两个对象都设置为单例模式,并不会出现线程安全的问题。
    <bean id="userDao" class="com.imooc.spring.ioc.dao.UserDao" scope="prototype">
    
        </bean>
    
        <bean id="userService" class="com.imooc.spring.ioc.service.UserService">
            <property name="userDao" ref="userDao"/>
        </bean>
    技巧:作为某一个属性,如果在运行过程中它是恒定不变的,那就可以在我们当前容器中进行单例的设置。但是如果这个属性在运行过程中不断地改变,那就要使用多例模式了。
  • 相关阅读:
    IE window对象跨域的一些特性
    杭州归来
    网上流行的JS HTMLDecode不安全
    看到的一点进步
    开春第一趟单骑上妙峰
    把JS函数转URL形式
    firebug也支持debugger关键字了
    发现一篇关于flash垃圾回收机制的文章
    Java 内存分析图
    继承中多态的灵活使用及其分析图 第一个程序的升级版
  • 原文地址:https://www.cnblogs.com/sx1011/p/13673709.html
Copyright © 2011-2022 走看看