String scopeName = mergedBeanDefinition.getScope(); //取得当前Bean的范围,也即在定义中的scope=”request”的部分。 Scope scope = (Scope) this.scopes.get(scopeName);//得到Bean工厂中的范围处理器 if (scope == null) { throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'"); } try { //使用scope.get(beanName,ObjectFactory)从指定的范围中得到或创建Bean实例 Object scopedInstance = scope.get(beanName, new ObjectFactory() { public Object getObject() throws BeansException { beforePrototypeCreation(beanName);//前拦截 try { return createBean(beanName, mergedBeanDefinition, args); //调用子类的createBean实现真正的Bean创建工作 } finally { afterPrototypeCreation(beanName);//后拦截 } } }); bean = getObjectForBeanInstance(scopedInstance, name, mergedBeanDefinition);//返回正确类型的Bean实例 } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active", ex); } |