Spring 5-从容器中取得bean
三、从容器中取得bean1、前面体会到了一点,那就是解析bean的职责分工;在这里,这个特点又有充分的体现;2、如何取得bean?
protected Object doGetBean(final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {final String beanName = transformedBeanName(name);Object bean = null;// 看是否能取到单例对象,这里调用的是DefaultSingletonBeanRegistry的方法// DefaultSingletonBeanRegistry负责管理单例的bean,这个我们在后面会谈到Object sharedInstance = getSingleton(beanName);if (sharedInstance != null) {if (logger.isDebugEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}} // 这里处理与FactoryBean相关的逻辑// 1 如果不是FactoryBean,直接返回// 2 如果是FactoryBean,且beanName以&开头,则直接返回FactoryBean// 3 如果不是以上两者,则通过factoryBean.getObject()取到工厂生产的bean实例bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// 如果当前的bean正在创建中,则说明是循环引用,这是不允许的if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// 如果当前容器中没有该bean的定义信息,则检查父容器中是否存在指定beanName的实例// 由上一节可知,DefaultListableBeanFactory主要负责BeanDefinition的注册// 这里调用的containsBeanDefinition(beanName)是由DefaultListableBeanFactory实现的BeanFactory parentBeanFactory = getParentBeanFactory();if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (args != null) {// Delegation to parent with explicit args.return parentBeanFactory.getBean(nameToLookup, args);}else {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}if (!typeCheckOnly) {markBeanAsCreated(beanName);}// 取得合并后的beanDefinition信息,然后cache起来final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// depend-on属性定义的前置bean,就是在这里创建的,看下面调用了getBean方法String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (int i = 0; i < dependsOn.length; i++) {String dependsOnBean = dependsOn[i];getBean(dependsOnBean);// 同时注册depend-on的bean与原bean的关系,主要是销毁bean时,要先销毁depend-on的bean// 这个功能是由DefaultSingletonBeanRegistry来完成的registerDependentBean(dependsOnBean, beanName);}}// 到现在,创建bean的条件都准备好了// 如果bean是单例,由DefaultSingletonBeanRegistry来完成单例的创建工作if (mbd.isSingleton()) {// 这里通过新产生一个ObjectFactory来创建并注册一个单例beansharedInstance = getSingleton(beanName, new ObjectFactory() {public Object getObject() throws BeansException {try { // 很巧妙地又将创建bean的主动权收回给自己 // 虽然最后创建bean的工作还是委托给了专门负责这一块的// AbstractAutowireCapableBeanFactory来完成return createBean(beanName, mbd, args);}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}}});// 这里和前面的一样,拿到单例bean后,又检查一下是否是FactoryBeanbean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}// 如果是原型beanelse if (mbd.isPrototype()) {// It's a prototype -> create a new instance.Object prototypeInstance = null;try {// 在创建原型bean前,将beanName放在prototypesCurrentlyInCreation中,避免循环创建beforePrototypeCreation(beanName);// 由子类AbstractAutowireCapableBeanFactory来完成bean的创建工作prototypeInstance = createBean(beanName, mbd, args);}finally {// 创建完成后,清理一下现场afterPrototypeCreation(beanName);}// 同样是检查是否是FactoryBeanbean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}// 其它类型的beanelse {String scopeName = mbd.getScope();final Scope scope = (Scope) this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");}try {// 其它类型的scope,其创建bean的实现方式,和前面创建singleton一样Object scopedInstance = scope.get(beanName, new ObjectFactory() {public Object getObject() throws BeansException {beforePrototypeCreation(beanName);try {// 由子类AbstractAutowireCapableBeanFactory来完成bean的创建工作return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}}});// 同样是检查是否是FactoryBeanbean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; " +"consider defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}// 检查bean的类型是否是继承或实现自requiredTypeif (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return bean;}?2 代码流程