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>
技巧:作为某一个属性,如果在运行过程中它是恒定不变的,那就可以在我们当前容器中进行单例的设置。但是如果这个属性在运行过程中不断地改变,那就要使用多例模式了。
posted @ 2020-09-15 16:16  看清楚了吗  阅读(155)  评论(0编辑  收藏  举报