spring_day1

幸弘光
2023-12-01
控制反转:
   把对象的创建交给spring容器来做
      spring容器创建对象的方式
         1、默认是调用默认的构造函数
         2、利用静态工厂方法创建
             spring调用工厂方法产生对象,但是真正创建对象还是由程序员来完成的
         3、实例工厂方法

        说明:
           spring配置文件中,只要是一个bean就会为该bean创建对象

      spring容器创建对象的时机
        *在单例的情况下
         1、在默认的情况下,启动spring容器创建对象
         2、在spring的配置文件bean中有一个属性lazy-init="default/true/false"
               1、如果lazy-init为"default/false"在启动spring容器时创建对象
               2、如果lazy-init为"true",在context.getBean时才要创建对象
           意义:
                1.当lazy-init为"default/false"时,可以在启动spring容器的时候,检查spring容器配置文件的正确性,如果再结合tomcat, 如果spring容器不能正常启动,整个tomcat就不能正常启动。但是这样的缺点是把一些bean过早的放在了 内存中,如果对象很多,则对内存来是一个消耗
                2.当lazy-init为"true",可以减少内存的消耗,但是不容易发现错误
        *在多例的情况下(scope=prototype时,无论lazy-init为什么值,都是如下情况)
            就是一种情况:在context.getBean时才创建对象

      spring的bean中的scope
        1、由spring产生的bean默认是单例的
        2、可以在spring的配置文件中,scope的值进行修改="singleton(单例)/prototype(多例)/request/session/global session"
        3、如果spring的配置文件的scope为"prototype",则在得到该bean(context.getBean())时才创建对象
      spring容器对象的生命周期:
        1、spring容器创建对象
        2、执行init方法
        3、调用自己的方法
        4、当spring容器关闭的时候执行destroy方法

   注意:因为ApplicationContext类里并没有close(),而ClassPathXmlApplicationContext类中有所以要将ApplicationContext强转为ClassPathXmlApplicationContext,然后再调用close()方法,可触发destroy方法。但是当scope="prototype"(多例)时,就算强转了,再调用close()也不会触发destroy方法

当scope为"prototype"时,spring容器不会再调用destroy方法了


配置别名:

<bean id="helloWorld_alias" class="com.xxc.spring.ioc.alias.HelloWorld"></bean>
<!-- name的属性和bean的id对应 -->
<alias name="helloWorld_alias" alias="别名"/>
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld hw = (HelloWorld) context.getBean("别名");//靠别名来获取bean



 类似资料:

相关阅读

相关文章

相关问答