spring 笔记3 BeanFactory

先来两张图




1、顶层接口BeanFactory ,获取bean等
2、直接继承的有三个接口:
AutowireCapableBeanFactory:不太明白作用
HierarchicalBeanFactory:描述父工厂作用
ListableBeanFactory:提供了操作工厂所有bean信息方法


3、下面的继承关系可以分两条路线看:
第一条:DefaultListableBeanFactory
从继承,实现来看,这个类实现了上面一级的所有接口功能,这个类里有很多map用来存放,容器的掌管的东西


第二条:ApplicationContext

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver

对应它的实现类AbstractApplicationContext来看,
实现BeanFactory,ListableBeanFactory,HierarchicalBeanFactory方法都是使用了getBeanFactory()
获得一个ConfigurableListableBeanFactory调用对应方法
getBeanFactory是一个虚方法需要子类实现




实现Lifecycle接口,使用getLifecycleProcessor()得到一个LifecycleProcessor,内部有一个这样的属性,并且有
初始化方法protected void initLifecycleProcessor()


实现MessageSource,ResourcePatternResolver接口,也是类似


有点共性(什么设计模式),就是第一个类实现一个接口方法,具体实现时候,调用本类的一个属性(这个属性已经实现了)的对应方法。


refresh()方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
obtainFreshBeanFactory方法


protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		refreshBeanFactory();
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	}

子类实现的:refreshBeanFactory()

@Override
	protected final void refreshBeanFactory() throws BeansException {
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}
protected DefaultListableBeanFactory createBeanFactory() {
		return new DefaultListableBeanFactory(getInternalParentBeanFactory());
	}


在AbstractRefreshableApplicationContext中refreshBeanFactory()初始化this.beanFactory,getBeanFactory()返回this.beanFactory
refreshBeanFactory()中调用了protected abstract void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法
来填充BeanDefinition




AbstractXmlApplicationContext中实现,是委托BeanDefinitionReader来做的

@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		// Create a new XmlBeanDefinitionReader for the given BeanFactory.
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		beanDefinitionReader.setEnvironment(this.getEnvironment());
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		initBeanDefinitionReader(beanDefinitionReader);
		loadBeanDefinitions(beanDefinitionReader);
	}
	
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
		Resource[] configResources = getConfigResources();
		if (configResources != null) {
			reader.loadBeanDefinitions(configResources);
		}
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}
	
protected Resource[] getConfigResources() {
		return null;
	}


最后ClassPathXmlApplicationContext中


@Override
protected Resource[] getConfigResources() {
		return this.configResources;
}
构造方法,初始化configResources,调用refresh初始化容器
public ClassPathXmlApplicationContext(String[] paths, Class clazz, ApplicationContext parent)
			throws BeansException {

		super(parent);
		Assert.notNull(paths, "Path array must not be null");
		Assert.notNull(clazz, "Class argument must not be null");
		this.configResources = new Resource[paths.length];
		for (int i = 0; i < paths.length; i++) {
			this.configResources[i] = new ClassPathResource(paths[i], clazz);
		}
		refresh();
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值