一,让我们了解IOC的概念
所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
二,了解什么是BeanFactory
BeanFactory是Spring中最重要的接口之一在我们学习Spring开发xml文件的方式中我们用的getBean()就是由他提供的。知道一说的是在这个接口中比较常用到的方法也只有这个getBean()方法,那为什么还说它是Spring最重要的接口呢?因为它的实现子类DefaultListableBeanFactory
实现了IOC也就是控制反转和依赖注入
ClassPathXmlApplicationContext中获取Bean
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
context.getBean(F1.class);
BeanFactory源码一观,里面只有getBean()方法是最重要的
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;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
IOC也就是控制反转就是把对象创建交给IOC容器,这里也可以说是Spring容器。后缀由带上Context的通常来说都是容器比如ClassPathXmlApplicationContext,
AnnotationConfigApplicationContext等等都是容器。然而我们要把类放进容器中就出现了问题。我们应该怎么把类放到也就是注册到容器中呢?这里就要用到BeanFactory实现子类DefaultListableBeanFactory来完成
三,什么是DefaultListableBeanFactory呢?
由上面的类图我们可以看见DefaultListableBeanFactory间接和直接继承了很多类其中BeanDefinitionRegistry提供了注册方法。
接下去让我们看看是如何把类注册到容器中的。很多容器都继承了DefaultListableBeanFactory所以才有注册Bean的功能,所以我们这边直接演示DefaultListableBeanFactory注册过程
四,DefaultListableBeanFactory注册Bean
简单注册不指定任何属性BeanDefinition
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
beanFactory.registerSingleton("f1", WebConfig.class);
注册且指定BeanDefinition
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//指定作用域
AbstractBeanDefinition webConfig = BeanDefinitionBuilder.genericBeanDefinition(WebConfig.class).setScope("singleton").getBeanDefinition();
//注册
beanFactory.registerBeanDefinition("webConfig",webConfig);
总结
所以说BeanFactory是Spring做重要的接口,控制反转和依赖注入都是它的实现子类DefaultListableBeanFactory完成的
可以观看另一篇文章了解更多注册以及BeanDefinition