• Spring Ioc源码分析


    Spring Ioc 源码分析


    什么是Ioc

    在面对对象编程的开发过程中,以对象为核心,一个系统应用往往是由多个对象之间相互协作完成的。对象与对象之间耦合在一起,如果其中一个对象出现了问题或者需要发生改变的话,整个系统都可能会出现问题。想要解决这个问题,解决对象之间的耦合的话,就需要引用第三方来将这些具有依赖关系的对象进行解耦。
    这个第三方就是我们所说的Ioc容器了,它把所有的对象的控制权收归所有,将所有的对象粘合在一起。在没有引用ioc的系统里面,如果一个对象需要依赖另一个对象的时候,需要自己主动地去创建一个对象或者使用已创建的对象,控制器在自己的手中,引入Ioc容器之后,当一个对象需要依赖另一个对象的时候,不再需要自己主动去创建对象,Ioc容器会创建一个对象注入到需要使用的地方,这样对象的控制权颠倒过来了,所以叫作依赖反转了。

    Spring Ioc实现

    Spring通过BeanDefinition来管理基于Spring的应用的对象与他们之间的相互依赖关系,BeanDefinition是依赖反转中管理对象与对象之间依赖关系的数据抽象。Spring Ioc容器是通过围绕对BeanDefinition的处理来完成。
    beanFactory

    在Ioc容器的设计类图中,BeanFactory是Ioc容器的基类,它主要是定义Ioc容器的基本功能方法及规范。在HierarchicalBeanFactory中则定义getParentBeanFactory方法来获取双亲的容器的功能,让BeanFactory具有管理双亲容器的能力。ConfigurableBeanFactory接口的话,则提供了一些工具来配置BeanFactory。再看以ApplicationContext应用上下文接口为核心的接口设计,ApplicationContext继承了ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory等BeanFactory接口,具有了BeanFactory Ioc容器的基本功能,还继承了MessageSource、ResourcePatternResolver、ApplicationEventPublisher接口,MessageSource提供了支持不同的信息源的功能,支持国际化的实现。ResourcePatternResolver接口提供了访问资源的功能、利用ResourceLoader和Resource可以从不同地方得到Bean定义资源。ApplicationEventPublisher接口提供了在上下文引入事件机制来管理Bean的生命周期。这些接口丰富Ioc容器的功能。

    Ioc容器初始化

    FileSystemXmlApplicationContext

    我们通过以FileSystemXmlApplicationContext为核心的继承体系,FileSystemXmlApplicationContext通过继承AbstractApplicationContext具备ResourceLoader加载Resource和Resource定义BeanDefinition的功能。
    Ioc容器的初始化是通过其构造函数的中的refresh()方法完成。。setConfigLocations()设置了定义BeanDefinition的Resource的Paths,它可以根据文件路径或者Url来创建不同的resource。通过refresh()方法实现了BeanDefinition的Resource定位、载入、注册过程.

    public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
    		super(parent);
    		setConfigLocations(configLocations);
    		if (refresh) {
    			refresh();
    		}
    	}
    

    BeanDefinition的Resource定位

    Resource定位是BeanDefinition的资源定位,它通过ResourceLoader对Resource接口完成,Resource对各种形式的BeanDefinition使用提供了统一接口。refresh()方法是在AbstractApplicationContext中实现的。refresh方法通过调用obtainFreshBeanFactory创建一个Ioc容器来提供给ApplicationContext使用。在创建Ioc容器的过程中,它是调用AbstractRefreshableApplicationContext的refreshBeanFactory()方法来创建,refreshBeanFactory()中通过getInternalParentBeanFactory来获取双亲容器信息来生成Ioc容器DefaultListableBeanFactory,然后将Ioc容器传入loadBeanDefinitions方法来委托给子类来调用相应BeanDefinitions方法。loadBeanDefinitions是在AbstractXmlApplicationContext中实现的。它是通过传入的ioc容器来构建相应的ResourceLoader(默认为DefaultResourceLoader)和Environment,然后返回XmlBeanDefinitionReader,然后委托给XmlBeanDefinitionReader来loadBeanDefinition。在XmlBeanDefinitionReade的loadBeanDefinition方法中,根据Resource的路径是绝对路径还是模式匹配来选择ResourceLoader,使用对应的getResource方法对location进行解析来获取Resource集合,完成了Resource的定位。

    protected final void refreshBeanFactory() throws BeansException {
    	//判断是否已经存在beanFactory,存在就将beanFactory销毁。
    	if (hasBeanFactory()) {
    		destroyBeans();
    		closeBeanFactory();
    	}
    	//创建和设置DefaultListableBeanFactory,然后调用AbstractXmlApplicationContext中实现的
    	//loadBeanDefinitions方法。
    		DefaultListableBeanFactory beanFactory = createBeanFactory();
    		beanFactory.setSerializationId(getId());
    		customizeBeanFactory(beanFactory);
    		loadBeanDefinitions(beanFactory);
    		synchronized (this.beanFactoryMonitor) {
    			this.beanFactory = beanFactory;
    		}
    	}
    }
    
    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
    	//创建XmlBeanDefinitionReader载入beanDefinition
    	XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
    	//通过上下文的资源载入环境信息在配置beanDefinitionReader
    	beanDefinitionReader.setEnvironment(this.getEnvironment());
    	beanDefinitionReader.setResourceLoader(this);
    	beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        
    	initBeanDefinitionReader(beanDefinitionReader);
    	//委托给beanDefinitionReader来载入beanDefinition
    	loadBeanDefinitions(beanDefinitionReader);
    }
    
    public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException {
    //获取ResourceLoader,使用的DefaultResourceLoader
    	ResourceLoader resourceLoader = getResourceLoader();
    	if (resourceLoader instanceof ResourcePatternResolver) {
    			Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
    			int loadCount = loadBeanDefinitions(resources);
    			if (actualResources != null) {
    				for (Resource resource : resources) {
    					actualResources.add(resource);
    				}
    			}
    			return loadCount;
    		}
    	}else {
    		Resource resource = resourceLoader.getResource(location);
    		int loadCount = loadBeanDefinitions(resource);
    		if (actualResources != null) {
    			actualResources.add(resource);
    		}
    		return loadCount;
    	}
    }
    
    public Resource getResource(String location) {
        //如果location是以classpath:开头的话,就构建ClassPathResource
    	if (location.startsWith(CLASSPATH_URL_PREFIX)) {
    		return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
    	}
    	else {
    		try {
    		    //默认以URL去解析location,
    			URL url = new URL(location);
    			return new UrlResource(url);
    		}
    		catch (MalformedURLException ex) {
    		    //如果以url形式去解析location失败,则构建ClassPathContextResource
    			return getResourceByPath(location);
    		}
    	}
    }
    

    BeanDefinition的载入和解析

    BeanDefinition的载入过程,就是把定义的BeanDefinition在Ioc容器转化为Spring的数据结构,通过HashMap来持有及维护。Ioc容器对Bean的管理和注入,是通过对BeanDefinition进行操作来实现的。对BeanDefinition的载入是Ioc容器初始化的一部分工作,refresh方法是Ioc容器的初始化入口。在在Resource的定位中,我们通过getResource来完成Resource的定位返回了Resource集合,然后BeanDefinition的载入则通过重载方法loadBeanDefinitions(Resource ..resources)的实现。Resource对象中封装了对文件的IO操作,可以直接打开IO来获取文件对象,然后通过documentLoader(默认为DefaultDocumentLoader)来解析文件来获取Document对象,documentLoader只是对通用的xml进行解析,并没有对Spring bean规则进行解析,Spring bean的解析是在DocumentReader(默认为DefaultBeanDefinitionDocumentReader,使用sax来解析xml)调用doRegisterBeanDefinitions委托给BeanDefinitionParserDelegate实现的。BeanDefinitionParserDelegate通过对各种Spring bean定义规则的处理和解析,在解析完成之后放到BeanDefinition对象中并由BeanDefinitionHolder持有。
    BeanDefinitionParserDelegate类有对各种property属性的解析方法,有兴趣的可以自己去查看。

    public void refresh() throws BeansException, IllegalStateException {
    	synchronized (this.startupShutdownMonitor) {
    		prepareRefresh();
    		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
            //通过上下文对beanFactory进行前置处理
    		prepareBeanFactory(beanFactory);
    		try {
                //beanFactory的后置处理设置
    			postProcessBeanFactory(beanFactory);
    			//调用beanFactory的后置处理器
                invokeBeanFactoryPostProcessors(beanFactory);
                //根据bean的配置,注册bean后置处理器,在bean创建期间调用
    			registerBeanPostProcessors(beanFactory);
    			//对消息源进行初始化
    			initMessageSource();
    			//初始化上下文的事件机制
    			initApplicationEventMulticaster();
    			onRefresh();
    			//注册监听器
    			registerListeners();
    			//对配置了not-lazy-init的单例对象进行初始化
    			finishBeanFactoryInitialization(beanFactory);
    			//发布事件,结束refresh过程。
    			finishRefresh();
    		}catch (BeansException ex) {
    		    //如果初始化失败,会销毁所有已经创建的bean
    			destroyBeans();
                //重置标志位
    			cancelRefresh(ex);
    			throw ex;
    		}
    	}
    }
    
    //调用入口方法
    public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
    	return loadBeanDefinitions(new EncodedResource(resource));
    }
    
    public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
    	Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
    	if (currentResources == null) {
    		currentResources = new HashSet<EncodedResource>(4);
    		this.resourcesCurrentlyBeingLoaded.set(currentResources);
    	}
    	try {
    	//获取xml文件的IO流
    		InputStream inputStream = encodedResource.getResource().getInputStream();
    		try {
    		    //获取IO的InputResource,准备读取
    			InputSource inputSource = new InputSource(inputStream);
    			if (encodedResource.getEncoding() != null) {
    				inputSource.setEncoding(encodedResource.getEncoding());
    			}
    			//具体的读取过程在doLoadBeanDefinitions方法实现
    			return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
    		}
    		finally {
    			inputStream.close();
    		}
    	}finally {
    		currentResources.remove(encodedResource);
    		if (currentResources.isEmpty()) {
    			this.resourcesCurrentlyBeingLoaded.remove();
    		}
    	}
    }
    
    protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
    	throws BeanDefinitionStoreException {
            //调用documentLoader来解析获取Document对象。(DefaultDocumentLoader)
    		Document doc = doLoadDocument(inputSource, resource);
    		//根据Spring bean定义的规则对beanDefinition的解析过程。
    		return registerBeanDefinitions(doc, resource);
       }
    //根据Document对象来注册BeanDefinition
    public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
            //构建BeanDefinitionDocumentReader
    		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
    		documentReader.setEnvironment(this.getEnvironment());
    		int countBefore = getRegistry().getBeanDefinitionCount();
    		//调用BeanDefinitionDocumentReader进行解析
    		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
    		return getRegistry().getBeanDefinitionCount() - countBefore;
    	}
    	//BeanDefinition解析的入口类,传入Document的root节点。
    protected void doRegisterBeanDefinitions(Element root) {
    	String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
    	if (StringUtils.hasText(profileSpec)) {
    		String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
    				profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
    		if (!this.environment.acceptsProfiles(specifiedProfiles)) {
    			return;
    		}
    	}
    	/*
    	beans节点嵌套导致doRegisterBeanDefinitions递归调用,为了正确的保存beans(default-*)属性,保存当前的delegate(parent),创建一个新的delegate(children)保存指向parent的引用,使用delegate(children)来解析beanDefinition,然后再将delegate指向parent。
    	*/
    	BeanDefinitionParserDelegate parent = this.delegate;
    	this.delegate = createDelegate(this.readerContext, root, parent);
    
    	preProcessXml(root);
    	//解析BeanDefinition
    	parseBeanDefinitions(root, this.delegate);
    	postProcessXml(root);
    
    	this.delegate = parent;
    }
    	//对于import alias、bean、等节点解析。
    protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
    	if (delegate.isDefaultNamespace(root)) {
    		NodeList nl = root.getChildNodes();
    		for (int i = 0; i < nl.getLength(); i++) {
    			Node node = nl.item(i);
    			if (node instanceof Element) {
    				Element ele = (Element) node;
    				if (delegate.isDefaultNamespace(ele)) {
    					parseDefaultElement(ele, delegate);
    				}
    				else {
    					delegate.parseCustomElement(ele);
    				}
    			}
    		}
    	}
    	else {
    		delegate.parseCustomElement(root);
    	}
    }
        //根据不同节点选择不同的method进行调用
    private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
    	if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
    		importBeanDefinitionResource(ele);
    	}
    	else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
    		processAliasRegistration(ele);
    	}
    	else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
    		processBeanDefinition(ele, delegate);
    	}
    	else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
    		doRegisterBeanDefinitions(ele);
    	}
    }
    //对Bean节点的解析    	
    protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
    	//解析返回beanDefinition并由BeanDefinitionHolder持有
    		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
    		if (bdHolder != null) {
    		    //对beanDefinitionHolder进行装饰
    			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
    			//注册BeanDefinition
    			BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
    			getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
    		}
    	}
    	
    	
    public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {
        //获取bean节点的id name和aliases的属性值
    	String id = ele.getAttribute(ID_ATTRIBUTE);
    	String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
    
    	List<String> aliases = new ArrayList<String>();
    	if (StringUtils.hasLength(nameAttr)) {
    		String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
    		aliases.addAll(Arrays.asList(nameArr));
    	}
    
    	String beanName = id;
    	if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
    		beanName = aliases.remove(0);
    	}
    
    	if (containingBean == null) {
    		checkNameUniqueness(beanName, aliases, ele);
    	}
        //对beanDefinition进行解析
    	AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);
    	if (beanDefinition != null) {
    		if (!StringUtils.hasText(beanName)) {
    				if (containingBean != null) {
    					beanName = BeanDefinitionReaderUtils.generateBeanName(
    							beanDefinition, this.readerContext.getRegistry(), true);
    				}
    				else {
    					beanName = this.readerContext.generateBeanName(beanDefinition);
    					String beanClassName = beanDefinition.getBeanClassName();
    					if (beanClassName != null &&
    							beanName.startsWith(beanClassName) && beanName.length() >beanClassName.length() &&!this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {
    						aliases.add(beanClassName);
    					}
    				}
    			}
    		}
    		String[] aliasesArray = StringUtils.toStringArray(aliases);
    		return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
    	}
    
    	return null;
    }
    
    public AbstractBeanDefinition parseBeanDefinitionElement(
    	Element ele, String beanName, BeanDefinition containingBean) {
    
    	this.parseState.push(new BeanEntry(beanName));
    
    	String className = null;
    	//获取className
    	if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
    		className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
    	}
    
    	try {
    		String parent = null;
    		if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
    			parent = ele.getAttribute(PARENT_ATTRIBUTE);
    		}
    		//创建Beandefinition对象
    		AbstractBeanDefinition bd = createBeanDefinition(className, parent);
            //对对应的bean属性解析,并设置description
    		parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
    		bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
            //解析元数据和元素信息解析
    		parseMetaElements(ele, bd);
    		parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
    		parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
    
    		parseConstructorArgElements(ele, bd);
    		parsePropertyElements(ele, bd);
    		parseQualifierElements(ele, bd);
    
    		bd.setResource(this.readerContext.getResource());
    		bd.setSource(extractSource(ele));
    
    		return bd;
    	}finally {
    		this.parseState.pop();
    	}
    	return null;
    }
    

    BeanDefinition在Ioc容器中的注册

    对BeanDefinition进行载入和解析之后,只是静态的配置信息,要发挥Ioc容器作用,需要在Ioc容器进行注册。Ioc容器通过维护一个HashMap来持有BeanDefinition,注册BeanDefinition是在BeanDefinitionParserDelegate解析beanDefinition之后,通过BeanDefinitionReaderUtils工具类registerBeanDefinition将BeanDefinition注册到Ioc容器中,它是委托给BeanDefinitionRegistry通过传入的beanFactory(DefaultListableBeanFactory实现了BeanDefinitionRegistry接口)来注册。
    完成BeanDefinition的注册,Ioc容器初始化就基本结束了,此时Ioc容器已经持有了BeanDefinition的配置信息,Ioc容器对Bean的管理就是通过对Beandefinition的操作来实现的。

    //删除了日志信息和异常处理,修改了部分源码,方便阅读
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    		throws BeanDefinitionStoreException {
    	//验证beanDefinition信息
    	if (beanDefinition instanceof AbstractBeanDefinition) {
    			((AbstractBeanDefinition) beanDefinition).validate();
    	}
    	//为了保证数据的一致,使用了synchronized加锁进行同步
    	synchronized (this.beanDefinitionMap) {
    		BeanDefinition oldBeanDefinition = this.beanDefinitionMap.get(beanName);
    	
    		if (oldBeanDefinition == null) {
    			this.beanDefinitionNames.add(beanName);
    			this.frozenBeanDefinitionNames = null;
    		}
    		this.beanDefinitionMap.put(beanName, beanDefinition);
    	}
    	resetBeanDefinition(beanName);
    }
    

    Ioc容器的依赖注入

    除了设置了not-lazy-init的bean,其他bean的依赖注入是在用户对Ioc容器第一个请求获取Bean的时候触发的。
    因此getBean方法是依赖注入的入口方法,我们可以通过AbstractBeanFactory来查看getBean的实现。在getBean方法,首先对要创建的bean是不是已经创建的单例对象,如果是就不会重新构建,否则就利用bean的BeanDefinition根据不同的bean类型来调用createBean方法。createBean方法是在AbstractAutowireCapableBeanFactory中实现。在创建bean中,主要的是bean的实例化和bean属性的依赖关系处理

    public Object getBean(String name, Object... args) throws BeansException {
    	return doGetBean(name, null, args, false);
    }
    
    protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
    		throws BeansException {
    	final String beanName = transformedBeanName(name);
    	Object bean;
    	//从已经创建的bean缓存中去获取bean,如果是已经创建过的单例bean就不需要再次创建。
    	Object sharedInstance = getSingleton(beanName);
    	if (sharedInstance != null && args == null) {
    	    //根据是否为FactoryBean进行相关处理
    		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    	}
    	else {
    	//对BeanFactory中是否存在对应BeanDefinition,如果没有的话,就去双亲BeanFactory中去查找,会一直
    	//向双亲BeanFactory链中往上寻找
    		BeanFactory parentBeanFactory = getParentBeanFactory();
    		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
    			String nameToLookup = originalBeanName(name);
    			if (args != null) {
    				return (T) parentBeanFactory.getBean(nameToLookup, args);
    			}
    			else {
    				return parentBeanFactory.getBean(nameToLookup, requiredType);
    			}
    		}
    		if (!typeCheckOnly) {
    			markBeanAsCreated(beanName);
    		}
    		try {
    		    //根据beanName获取对应的BeanDefinition。
    			final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    			checkMergedBeanDefinition(mbd, beanName, args);
                //获取bean的所有依赖bean,会导致递归调用getBean,直到没有依赖Bean
    			String[] dependsOn = mbd.getDependsOn();
    			if (dependsOn != null) {
    				for (String dependsOnBean : dependsOn) {
    					if (isDependent(beanName, dependsOnBean)) {
    					}
    					registerDependentBean(dependsOnBean, beanName);
    					getBean(dependsOnBean);
    				}
    			}
    			//通过回调方法调用createBean创建单例对象
    			if (mbd.isSingleton()) {
    				sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
    					@Override
    					public Object getObject() throws BeansException {
    						try {
    							return createBean(beanName, mbd, args);
    						}
    						catch (BeansException ex) {
    							destroySingleton(beanName);
    							throw ex;
    						}
    					}
    				});
    				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    			}
    			//获取Prototype对象
    			else if (mbd.isPrototype()) {
    				Object prototypeInstance = null;
    				try {
    					beforePrototypeCreation(beanName);
    					prototypeInstance = createBean(beanName, mbd, args);
    				}
    				finally {
    					afterPrototypeCreation(beanName);
    				}
    				bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
    			}else {
    			    //request和session范围的bean
    				String scopeName = mbd.getScope();
    				final Scope scope = this.scopes.get(scopeName);
    				try {
    					Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
    						@Override
    						public Object getObject() throws BeansException {
    							beforePrototypeCreation(beanName);
    							try {
    								return createBean(beanName, mbd, args);
    							}
    							finally {
    								afterPrototypeCreation(beanName);
    							}
    						}
    					});
    					bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
    				}
    				catch (IllegalStateException ex) {
    				
    				}
    			}
    		}
    		catch (BeansException ex) {
    			cleanupAfterBeanCreationFailure(beanName);
    			throw ex;
    		}
    	}
        //对bean类型进行类型检查
    	if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {
    			return getTypeConverter().convertIfNecessary(bean, requiredType);
    	}
    	return (T) bean;
    }
    	
    protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) throws BeanCreationException {
        	//判断类是否可以实例化(抽象类和接口不可实例化)
    		resolveBeanClass(mbd, beanName);
    		mbd.prepareMethodOverrides();
    		//如果Bean配置了PostProcessor,将会返回一个Proxy对象。
    		Object bean = resolveBeforeInstantiation(beanName, mbd);
    		if (bean != null) {
    			return bean;
    		}
    		//创建bean入口
    		Object beanInstance = doCreateBean(beanName, mbd, args);
    		return beanInstance;
    	}
    
    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
    	//用来持有创建的bean对象
    	BeanWrapper instanceWrapper = null;
    	//如果是单例bean,要将缓存中的同名bean清除
    	if (mbd.isSingleton()) {
    		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    	}
    	//创建bean
    	if (instanceWrapper == null) {
    		instanceWrapper = createBeanInstance(beanName, mbd, args);
    	}
    	final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
    	Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
    	synchronized (mbd.postProcessingLock) {
    		if (!mbd.postProcessed) {
    			applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
    			mbd.postProcessed = true;
    		}
    	}
    	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
    			isSingletonCurrentlyInCreation(beanName));
    	if (earlySingletonExposure) {
    		addSingletonFactory(beanName, new ObjectFactory<Object>() {
    			@Override
    			public Object getObject() throws BeansException {
    				return getEarlyBeanReference(beanName, mbd, bean);
    			}
    		});
    	}
    	Object exposedObject = bean;
    	//对bean进行初始化,对bean的属性进行配置和依赖注入,返回的exposeObject是依赖注入后的bean
    	populateBean(beanName, mbd, instanceWrapper);
    	if (exposedObject != null) {
    		exposedObject = initializeBean(beanName, exposedObject, mbd);
    	}
    	}
    
    	if (earlySingletonExposure) {
    		Object earlySingletonReference = getSingleton(beanName, false);
    		if (earlySingletonReference != null) {
    			if (exposedObject == bean) {
    				exposedObject = earlySingletonReference;
    			}
    			else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
    				String[] dependentBeans = getDependentBeans(beanName);
    				Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
    				for (String dependentBean : dependentBeans) {
    					if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
    						actualDependentBeans.add(dependentBean);
    					}
    				}
    			}
    		}
    	}
    	registerDisposableBeanIfNecessary(beanName, bean, mbd);
    	return exposedObject;
    }
    

    实例化Bean对象

    实例化Bean对象是在createBeanInstance中完成的,bean对象的生成可以通过工厂方法、autowire、构造器方法生成,可以通过配置Beandefinition来指定。对象生成的具体实现,如果有兴趣可以自行阅读源码,现暂不分析。

    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
            //获取要创建的Bean的Class对象
    	Class<?> beanClass = resolveBeanClass(mbd, beanName);
    	//使用工厂方法对bean进行实例化
    	if (mbd.getFactoryMethodName() != null)  {
    		return instantiateUsingFactoryMethod(beanName, mbd, args);
    	}
    	boolean resolved = false;
    	boolean autowireNecessary = false;
    	if (args == null) {
    		synchronized (mbd.constructorArgumentLock) {
    			if (mbd.resolvedConstructorOrFactoryMethod != null) {
    				resolved = true;
    				autowireNecessary = mbd.constructorArgumentsResolved;
    			}
    		}
    	}
    	if (resolved) {
    		if (autowireNecessary) {
    		   //通过type进行autowire
    			return autowireConstructor(beanName, mbd, null, null);
    		}
    		else {
    		//使用默认策略来生成bean对象,既通过gclib来对bean进行实例化
    			return instantiateBean(beanName, mbd);
    		}
    	}
    	//根据传入参数来选择对应的构造器函数来实例化bean对象
    	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    	if (ctors != null ||
    			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
    			mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
    		return autowireConstructor(beanName, mbd, ctors, args);
    	}
    	return instantiateBean(beanName, mbd);
    }
    

    配置依赖关系和依赖注入

    Bean的依赖关系通过BeanDefinition来处理,BeanDefinitionValueResolver对BeanDefinition进行解析,BeanWrapperImpl进行依赖注入

    protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
    //获取在BeanDefinition中设置的property值,如果propertyValues为空则立即返回
    	PropertyValues pvs = mbd.getPropertyValues();
    	if (bw == null) {
    		if (pvs.isEmpty()) {
    			return;
    		}
    	}
    	boolean continueWithPropertyPopulation = true;
    	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    		for (BeanPostProcessor bp : getBeanPostProcessors()) {
    			if (bp instanceof InstantiationAwareBeanPostProcessor) {
    				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    					continueWithPropertyPopulation = false;
    					break;
    				}
    			}
    		}
    	}
    	if (!continueWithPropertyPopulation) {
    		return;
    	}
    	//依赖注入过程开始,首先对autowire先进行处理。
    	if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
    			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    		MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    		//根据name注入
    		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
    			autowireByName(beanName, mbd, bw, newPvs);
    		}
    		//根据type注入
    		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
    			autowireByType(beanName, mbd, bw, newPvs);
    		}
    		pvs = newPvs;
    	}
    	boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    	boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
    	if (hasInstAwareBpps || needsDepCheck) {
    		PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    		if (hasInstAwareBpps) {
    			for (BeanPostProcessor bp : getBeanPostProcessors()) {
    				if (bp instanceof InstantiationAwareBeanPostProcessor) {
    					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    					pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    					if (pvs == null) {
    						return;
    					}
    				}
    			}
    		}
    		if (needsDepCheck) {
    			checkDependencies(beanName, mbd, filteredPds, pvs);
    		}
    	}
    	//对属性开始注入
    	applyPropertyValues(beanName, mbd, bw, pvs);
    }
    
    protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
    	if (pvs == null || pvs.isEmpty()) {
    		return;
    	}
    
    	MutablePropertyValues mpvs = null;
    	List<PropertyValue> original;
    
    	if (System.getSecurityManager() != null) {
    		if (bw instanceof BeanWrapperImpl) {
    			((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
    		}
    	}
    
    	if (pvs instanceof MutablePropertyValues) {
    		mpvs = (MutablePropertyValues) pvs;
    		if (mpvs.isConverted()) {
    			bw.setPropertyValues(mpvs);
    			return;
    		}
    		original = mpvs.getPropertyValueList();
    	}
    	else {
    		original = Arrays.asList(pvs.getPropertyValues());
    	}
    
    	TypeConverter converter = getCustomTypeConverter();
    	if (converter == null) {
    		converter = bw;
    	}
    	BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
    	//对解析值创建一个副本。
    	List<PropertyValue> deepCopy = new ArrayList<PropertyValue>(original.size());
    	boolean resolveNecessary = false;
    	for (PropertyValue pv : original) {
    		if (pv.isConverted()) {
    			deepCopy.add(pv);
    		}
    		else {
    			String propertyName = pv.getName();
    			Object originalValue = pv.getValue();
    			Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
    			Object convertedValue = resolvedValue;
    			boolean convertible = bw.isWritableProperty(propertyName) &&
    					!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
    			if (convertible) {
    				convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
    			}
    			if (resolvedValue == originalValue) {
    				if (convertible) {
    					pv.setConvertedValue(convertedValue);
    				}
    				deepCopy.add(pv);
    			}
    			else if (convertible && originalValue instanceof TypedStringValue &&
    					!((TypedStringValue) originalValue).isDynamic() &&
    					!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
    				pv.setConvertedValue(convertedValue);
    				deepCopy.add(pv);
    			}
    			else {
    				resolveNecessary = true;
    				deepCopy.add(new PropertyValue(pv, convertedValue));
    			}
    		}
    	}
    	if (mpvs != null && !resolveNecessary) {
    		mpvs.setConverted();
    	}
    	//依赖注入,通过BeanWrapperImplementation完成
    	bw.setPropertyValues(new MutablePropertyValues(deepCopy));
    }
  • 相关阅读:
    自定义样式滚动条
    html文本超出加省略号
    getcomputedstyle和style的区别
    模块化设计
    js数组取出非重复元素
    vue 获取元素高度
    js 滚动条滑动
    swiper基本使用
    flex弹性盒子布局
    js 地区三级联动 2
  • 原文地址:https://www.cnblogs.com/xianyijun/p/5339115.html
Copyright © 2020-2023  润新知