• 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>
    技巧:作为某一个属性,如果在运行过程中它是恒定不变的,那就可以在我们当前容器中进行单例的设置。但是如果这个属性在运行过程中不断地改变,那就要使用多例模式了。
  • 相关阅读:
    作业DAY002
    作业DAY001
    作业 5:词频统计——增强功能
    在JdbcTemplate里面关于queryForMap返回值的疑问
    直接打印map, 为什么能直接输出value
    JdbcTemplate jar包 下载
    edge 修改链接打开方式
    Java中的判断实例
    关于Junit4 和 Junit5.4
    关于函数式接口, printable 自定义
  • 原文地址:https://www.cnblogs.com/sx1011/p/13673709.html
Copyright © 2020-2023  润新知