1 ioc和di
ioc,inversion of control
控制转化。控制主要指的是对对象的创建的控制,本来程序按需创建对象,但是现在控制权交给第三方,即spring,程序不需要自己创建对象了,它需要对象的时候只要从spring的Bean容器中get即可,即控制权由程序转化到了第三方框架spring。
di,dependency injection
依赖注入。假如A依赖于对象B,如果不使用spring的话,我们需要首先创建B对象,然后再创建A对象,但是,依赖注入是说,从java Bean容器中获取A对象的时候,只要在xml中指定了A和B的依赖关系,A所依赖的B对象直接由spring注入给A使用。
2 spring IOC容器中的beans是何时创建的
如果scope是单例的话,默认情况下是ioc容器启动的时候就会实例化,但是如果设置了lazy-init="true"的话,那么要等到getBean()的时候才实例化该bean。
如果scope是prototype的话,是要等到getBean()时才会实例化该bean,原因很简单,都没有用就实例化的话,浪费内存。
创建ClassPathXmlApplicationContext对象的时候,只是解析了spring xml配置文件,然后将里面用bean标签定义的bean元素创建BeanDefinion对象,放入DefaultListableBeanFactory的ConcurrentHashMap中。
prototype的bean的实例化是在getBean()的时候。
可见,除了对象的实例化不同以外,spring对主逻辑几乎没有影响,这样做带来的巨大好处就是对对象解耦合。