欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring ——Bean工厂(BeanFactory)和应用上下文(ApplicationContext)装载Bean的区别,已经bean的作用域

程序员文章站 2022-03-03 11:50:09
...

除了附加功能外。两者的重要区别是关于单例bean如何被加载。

bean工厂延迟加载所以bean,直到getBean()方法被调用的时候才会创建bean的实例对象。

ApplicationContext在启动后预载入所有单例bean,需要的时候直接getBean()取出即可,这样可以确保应用不需要等待他们被创建。

 

注:1. bean工厂的new XmlBeanFactory在spring3.1后就过期了,不在提倡。ApplicationContext占内存,但是快,而且现在硬件内存大便宜,所以都推荐使用ApplicationContext

         2. 说的是单例bean。如果不是单例,ApplicationContext也不会创建bean。即关系到bean的作用域 scope属性

 <bean id="lowerLetter" scope="prototype" class="top.chgl16.springStudy3.letter.LowerLetter">
        <!-- scope="singleton 意思在spring ioc容器每一个bean定义对应一个对象实例, scope=“prototype”意思的一个bean定义对应多个对象实例-->
        <property name="str" value="ABC"></property>        <!-- spring中的类都叫bean,property是给类成员初始化 -->
    </bean>

 

定义bean的属性scope,如果设置为singleton,则就是单例bean,使用ApplicationContext加载一定会创建一个bean对象实例,所以创建的对象都是同一个bean,地址一样,构造函数只运行一次(可以使用构造函数区别)

 

而设置scope属性值为prototype, ApplicationContext加载时是不会创建该bean实例的,如同bean工厂了。只有在getBean()方法被调用时才会创建bean对象实例,而且每个对象都不同,地址是不同的,每次调用getBean方法就执行一次构造函数。

        ApplicationContext ac = new ClassPathXmlApplicationContext("META-INF/beans.xml");
        ChangeLetter ll1 = (ChangeLetter) ac.getBean("lowerLetter");
        ChangeLetter ll2 = (ChangeLetter) ac.getBean("lowerLetter");
        System.out.println(ll1 + " "  + ll2);
五月 12, 2018 5:47:10 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org[email protected]5010be6: startup date [Sat May 12 17:47:10 CST 2018]; root of context hierarchy
五月 12, 2018 5:47:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [META-INF/beans.xml]
LowerLetter的构造方法运行了
LowerLetter的构造方法运行了
[email protected] [email protected]

如上scope为prototype的输出