Spring的IOC容器仅仅是一个逻辑容器。负责对象的创建和销毁。尤其是销毁。IOC容器对对象的销毁仅仅是逻辑上的。刚开始的时候一直搞不清楚IOC容器与JVM之间的关系。JVM如果是一个仓库,那么Spring IOC容器就是JVM仓库的前面的一个杂货店。
xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myCar" class="com.maishuiguo.datasource.MyCar" init-method="init" destroy-method="destory" > </bean> </beans>
java
package com.maishuiguo.datasource; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "beans.xml"); MyCar myCar = (MyCar) context.getBean("myCar"); context.close(); System.out.println(myCar.getName()); //打印出audio } }
关闭了容器,依然能够打印出值。
Spring的单例也是在一个IOC容器的单例。
那么可以想到,Spring的单例实现不是直接使用的静态变量(静态变量在JVM中是唯一的),而是使用一个(JVM的)beanfactroy使用map来存储这个IOC容器内的单例。
如果要使在JVM里面都是单例呢?那么只需要让只有这个商店卖这个货物就行了。