Ioc容器——BeanFactory和ApplicationContext
1. Spring Ioc容器
说起Ioc容器,就不得不说控制反转和依赖注入了。这是Spring的核心原理,先说一下什么是Ioc容器,可以这么理解Ioc容器,就像一个高级的工厂类,帮助你创建、管理、销毁对象。如果你想要的对象中有引用类型,Ioc就会自动注入。
下面说一下什么是控制反转。以前我们写程序都是由程序猿创建对象,这也就是所谓的我们控制对象。控制反转顾名思义,就是由Ioc容器帮助我们控制对象,控制权交给了Ioc容器,我们只需要从Ioc容器获取想要的对象即可,不再考虑如何创建对象了。
依赖注入又是什么?你把对象的控制权交给了Ioc容器,Ioc容器根据对象依赖的属性进行一一注入,简单讲就是赋值,保证你所拿到的对象不会出现什么空指针的异常。
Spring火遍世界的绝大部分原因就是它颠覆了传统的开发思想,将控制反转和依赖注入带入到了开发者的面前。这种思想减少了程序间的耦合度,让开发者更多的去专注于业务,而非创建对象,管理对象······这些无用的方面。
2. BeanFactory和ApplicationContext关系
-
BeanFactory采用的是延迟加载,也就是等到getBean的时候才进行依赖注入,而ApplicationContext采用的一次性创建所有的Bean。
-
BeanFactory和ApplicationContext是Spring容器的两个核心接口,并且ApplicationContext继承了BeanFactory。
-
BeanFactory一般称之为Spring Ioc容器,而ApplicationContext则称之为应用上下文。Spring中的容器大概分为两种,一种是直接继承了BeanFactory,这是最简单的,只是基本上实现了DI;另一种是继承了派生后的ApplicationContext,他能提供更多的服务,可以解析文本等等。
3. BeanFactory
BeanFactory是Ioc容器的根接口,独立使用的BeanFactory的是DefaultListableBeanFactory类,Bean的容器实际上就是一个Map,实现的是ConcurrentMap。
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
4. ApplicationContext
ApplicationContext是BeanFactory的完整体,它将变成配置化,ApplicationContext不仅继承了BeanFactory的基本功能,还继承了MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等,下面继承类图可以看出。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}