Spring 框架能够说是Java世界中最成功的框架,它的成功来自于理念,而不是技术,它最核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Spring的基础,而AOP则是其最重要的功能。spring
控制反转是一个比较抽象的概念,先举一个实际生活中的例子说明。当人们想喝苹果汁的时候,在没有饮品店的时候,最直观的作法是,要买榨汁机,苹果和矿泉水。这些东西都是本身“主动”创造的过程,也就是这杯苹果汁须要本身主动创造。然而现在,有各类饮品店本身不必去榨果汁了。若是想要喝苹果汁,能够直接找到饮品店的联系方式,描述想要的饮料信息,留下地址和联系方式下单等待便可。在这个过程当中我并无“主动”创造苹果汁,也就是苹果汁是由饮品店创造的,而不是我本身,但也达到了个人要求。在潜意识里咱们会以为对象应该由咱们主动创造,但事实上这并非咱们的真实需求,由于也许你对这个领域并不精通,这个时候把建立对象的主动权转交给别人,这就是控制反转的概念。控制反转这个理念虽然理解上有些困难,可是好处在于下降了对象之间的耦合。这里对象的产生依靠于IoC容器,而不是开发者主动的行为。主动建立的模式,责任归于开发者,而在被动模式下,责任归于IoC容器。基于这样的被动形式,咱们就说对象被控制反转了。编程
Spring IoC容器做用是容纳咱们开发的各类Bean,而且咱们能够从中获取各类发布在Spring IoC容器里的Bean,而且经过描述能够获得它。Spring IoC容器的设计主要基于BeanFactory和ApplicationContext两个接口,其中ApplicationContext是BeanFactory的子接口,也就是BeanFactory是Spring IoC容器的最底层接口。由于ApplicationContext接口对BeanFactory接口作了许多有用的扩展,因此在绝大多数状况下都会使用ApplicationContext做为Spring IoC容器。框架
下面是BeanFactory的源码(去掉了注释)ui
1 package org.springframework.beans.factory; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.core.ResolvableType; 5 import org.springframework.lang.Nullable; 6 7 public interface BeanFactory { 8 9 String FACTORY_BEAN_PREFIX = "&"; 10 11 Object getBean(String name) throws BeansException; 12 13 <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException; 14 15 Object getBean(String name, Object... args) throws BeansException; 16 17 <T> T getBean(Class<T> requiredType) throws BeansException; 18 19 <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; 20 21 boolean containsBean(String name); 22 23 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; 24 25 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; 26 27 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; 28 29 boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException; 30 31 32 @Nullable 33 Class<?> getType(String name) throws NoSuchBeanDefinitionException; 34 35 String[] getAliases(String name); 36 37 }
Bean的定义和初始化在Spring IoC容器是两大步骤,先是定义,而后初始化和依赖注入。spa
Bean定义分为3步:设计
作完这三步Bean就在Spring IoC容器中被定义了,而没有初始化和依赖注入。对于初始化和依赖注入,Spring Bean有一个配置选项---lazy-init,在没有配置状况下,默认值default为false,也就是默认自动初始化Bean。将其设置为true,只有当使用Spring IoC容器的getBean方法获取它时,它才会初始化,完成依赖注入。code
从上图(图来源《Java EE互联网轻量级框架整合开发 》)能够看到Spring IoC容器在执行了初始化和依赖注入后,会执行必定步骤来完成初始化,经过这些步骤就能够自定义初始化,而在Spring IoC容器正常关闭的时候,它会执行必定步骤关闭容器释放资源。注意,从上图能够看到有些方法须要实现特定的接口才能实现。对象