• Spring框架之一 读取配置文件


    以下代码都是来源于官方源码(Spring-4.3.18.RELEASE),此处只是为自己以后深啃先布局出大概流程,请各看官不要浪费时间看

    说明: .. 表示省略代码, // 后的如果不是源码自带则为当时DEBUG时的值

    文件spring-config.xml内容

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="myHelloWorld" class="HelloWorld">
            <property name="name" value="Spring"></property>
        </bean>
    </beans>

    HelloWorld.java

    public class HelloWorld {
        private String name ;
       public HelloWorld(){
            System.out.println("create helloworld class");
        }
    
        public void setName(String name){
            this.name = name ;
            System.out.println("set name is:" + name);
        }
       public void sayHello(){
            System.out.print("Hello " + name);
        }
    }

    由主入口开始:

    public class Main {
      public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        HelloWorld tt = (HelloWorld)context.getBean("myHelloWorld") ;
        tt.sayHello();
      }
    }

    1.  ClassPathXmlApplicationContext("spring-config.xml") 

    继承体系:
    AbstractApplicationContext             extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean
    | AbstractRefreshableApplicationContext     extends AbstractApplicationContext
    | AbstractRefreshableConfigApplicationContext  extends AbstractRefreshableApplicationContext implements BeanNameAware, InitializingBean
    | AbstractXmlApplicationContext          extends AbstractRefreshableConfigApplicationContext
    | ClassPathXmlApplicationContext         extends AbstractXmlApplicationContext
    => ClassPathXmlApplicationContext.class
    public ClassPathXmlApplicationContext(String configLocation) throws BeansException { // configLocation = spring-config.xml
    this(new String[]{configLocation}, true, (ApplicationContext)null);
    }
        
    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); // parent : null this.setConfigLocations(configLocations); if (refresh) { // refresh: true this.refresh(); } }
    => AbstractApplicationContext.class
    public void refresh() throws BeansException, IllegalStateException {
        Object var1 = this.startupShutdownMonitor;
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);
    
            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
    this.finishBeanFactoryInitialization(beanFactory); // org.springframework.beans.factory.support.DefaultListableBeanFactory@5e0826e7: defining beans [myHelloWorld]; root of factory hierarchy
           this.finishRefresh(); } catch (BeansException var9) { if (this.logger.isWarnEnabled()) { this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9); } this.destroyBeans(); this.cancelRefresh(var9); throw var9; } finally { this.resetCommonCaches(); } } } protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) { beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class)); } if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(new StringValueResolver() { public String resolveStringValue(String strVal) { return AbstractApplicationContext.this.getEnvironment().resolvePlaceholders(strVal); } }); } String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); String[] var3 = weaverAwareNames; int var4 = weaverAwareNames.length; for(int var5 = 0; var5 < var4; ++var5) { String weaverAwareName = var3[var5]; this.getBean(weaverAwareName); } beanFactory.setTempClassLoader((ClassLoader)null); beanFactory.freezeConfiguration(); beanFactory.preInstantiateSingletons(); }

    => DefaultListableBeanFactory.class

    public void preInstantiateSingletons() throws BeansException {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Pre-instantiating singletons in " + this);
            }
    
            List<String> beanNames = new ArrayList(this.beanDefinitionNames); // beanDefinitionNames: size = 1
            Iterator var2 = beanNames.iterator();
    
            while(true) {
                while(true) {
                    String beanName;  // beanName: "myHelloWorld"
                    RootBeanDefinition bd;
                    do {
                        do {
                            do {
                                if (!var2.hasNext()) {
                                    var2 = beanNames.iterator();
    
                                    while(var2.hasNext()) {
                                        beanName = (String)var2.next();
                                        Object singletonInstance = this.getSingleton(beanName);
                                        if (singletonInstance instanceof SmartInitializingSingleton) {
                                            final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton)singletonInstance;
                                            if (System.getSecurityManager() != null) {
                                                AccessController.doPrivileged(new PrivilegedAction<Object>() {
                                                    public Object run() {
                                                        smartSingleton.afterSingletonsInstantiated();
                                                        return null;
                                                    }
                                                }, this.getAccessControlContext());
                                            } else {
                                                smartSingleton.afterSingletonsInstantiated();
                                            }
                                        }
                                    }
    
                                    return;
                                }
    
                                beanName = (String)var2.next();
                                bd = this.getMergedLocalBeanDefinition(beanName);
                            } while(bd.isAbstract());
                        } while(!bd.isSingleton());
                    } while(bd.isLazyInit());
    
                    if (this.isFactoryBean(beanName)) {
                        final FactoryBean<?> factory = (FactoryBean)this.getBean("&" + beanName);
                        boolean isEagerInit;
                        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                            isEagerInit = (Boolean)AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                                public Boolean run() {
                                    return ((SmartFactoryBean)factory).isEagerInit();
                                }
                            }, this.getAccessControlContext());
                        } else {
                            isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
                        }
    
                        if (isEagerInit) {
                            this.getBean(beanName);
                        }
                    } else {
                        this.getBean(beanName); // beanName : "myHelloWorld"
                    }
                }
            }
        }

     => AbstractBeanFactory.class

    public Object getBean(String name) throws BeansException {
            return this.doGetBean(name, (Class)null, (Object[])null, false);  // name: "myHelloWorld"
        }
        
        protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
            final String beanName = this.transformedBeanName(name);  // name: "myHelloWorld"
            Object sharedInstance = this.getSingleton(beanName);  // sharedInstance: null
            Object bean;
            if (sharedInstance != null && args == null) {
                if (this.logger.isDebugEnabled()) {
                    if (this.isSingletonCurrentlyInCreation(beanName)) {
                        this.logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
                    } else {
                        this.logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
                    }
                }
    
                bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
            } else {
                if (this.isPrototypeCurrentlyInCreation(beanName)) {
                    throw new BeanCurrentlyInCreationException(beanName);
                }
    
                BeanFactory parentBeanFactory = this.getParentBeanFactory();  // parentBeanFactory: null
                if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
                    String nameToLookup = this.originalBeanName(name);  // name: "myHelloWorld"
                    if (args != null) {
                        return parentBeanFactory.getBean(nameToLookup, args);
                    }
    
                    return parentBeanFactory.getBean(nameToLookup, requiredType);
                }
    
                if (!typeCheckOnly) {
                    this.markBeanAsCreated(beanName);
                }
    
                try {
                    final RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
                    this.checkMergedBeanDefinition(mbd, beanName, args);
                    String[] dependsOn = mbd.getDependsOn();
                    String[] var11;
                    if (dependsOn != null) {
                        var11 = dependsOn;
                        int var12 = dependsOn.length;
    
                        for(int var13 = 0; var13 < var12; ++var13) {
                            String dep = var11[var13];
                            if (this.isDependent(beanName, dep)) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                            }
    
                            this.registerDependentBean(dep, beanName);
    
                            try {
                                this.getBean(dep);
                            } catch (NoSuchBeanDefinitionException var24) {
                                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
                            }
                        }
                    }
    
                    if (mbd.isSingleton()) { // mbd: Root bean: class [HelloWorld]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring-config.xml]
                        sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() { // 创建单实例,会跳到 DefaultSingletonBeanRegistry.class
                            public Object getObject() throws BeansException {
                                try {
                                    return AbstractBeanFactory.this.createBean(beanName, mbd, args);
                                } catch (BeansException var2) {
                                    AbstractBeanFactory.this.destroySingleton(beanName);
                                    throw var2;
                                }
                            }
                        });
                        bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                    } else if (mbd.isPrototype()) {
                        var11 = null;
    
                        Object prototypeInstance;
                        try {
                            this.beforePrototypeCreation(beanName);
                            prototypeInstance = this.createBean(beanName, mbd, args);
                        } finally {
                            this.afterPrototypeCreation(beanName);
                        }
    
                        bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
                    } else {
                        String scopeName = mbd.getScope();
                        Scope scope = (Scope)this.scopes.get(scopeName);
                        if (scope == null) {
                            throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                        }
    
                        try {
                            Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
                                public Object getObject() throws BeansException {
                                    AbstractBeanFactory.this.beforePrototypeCreation(beanName);
    
                                    Object var1;
                                    try {
                                        var1 = AbstractBeanFactory.this.createBean(beanName, mbd, args);
                                    } finally {
                                        AbstractBeanFactory.this.afterPrototypeCreation(beanName);
                                    }
    
                                    return var1;
                                }
                            });
                            bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                        } catch (IllegalStateException var23) {
                            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", var23);
                        }
                    }
                } catch (BeansException var26) {
                    this.cleanupAfterBeanCreationFailure(beanName);
                    throw var26;
                }
            }
    
            if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
                try {
                    return this.getTypeConverter().convertIfNecessary(bean, requiredType);
                } catch (TypeMismatchException var25) {
                    if (this.logger.isDebugEnabled()) {
                        this.logger.debug("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var25);
                    }
    
                    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
                }
            } else {
                return bean;
            }
        }    

    => AbstractAutowireCapableBeanFactory.class

        // beanName: myHelloWorld
        // mbd: Root bean: class [HelloWorld]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring-config.xml]
        // args: null
        protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Creating instance of bean '" + beanName + "'");
            }
    
            RootBeanDefinition mbdToUse = mbd;
            Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]); // resolvedClass: class HelloWorld
            if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
                mbdToUse = new RootBeanDefinition(mbd);
                mbdToUse.setBeanClass(resolvedClass);
            }
    
            try {
                mbdToUse.prepareMethodOverrides();
            } catch (BeanDefinitionValidationException var7) {
                throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var7);
            }
    
            Object beanInstance;
            try {
                beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
                if (beanInstance != null) {
                    return beanInstance;
                }
            } catch (Throwable var8) {
                throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
            }
    
            // beanName: myHelloWorld
            // mbdToUse: Root bean: class [HelloWorld]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring-config.xml]
            beanInstance = this.doCreateBean(beanName, mbdToUse, args);
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Finished creating instance of bean '" + beanName + "'");
            }
    
            return beanInstance;
        }
        
        protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
            BeanWrapper instanceWrapper = null;
            if (mbd.isSingleton()) {
                instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
            }
    
            if (instanceWrapper == null) {
                instanceWrapper = this.createBeanInstance(beanName, mbd, args);
            }
    
            final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null;  // bean: HelloWorld@1531
            Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass() : null; // beanType: class HelloWorld
            mbd.resolvedTargetType = beanType;
            Object var7 = mbd.postProcessingLock;
            synchronized(mbd.postProcessingLock) {
                if (!mbd.postProcessed) {
                    try {
                        this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                    } catch (Throwable var17) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
                    }
    
                    mbd.postProcessed = true;
                }
            }
    
            boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
            if (earlySingletonExposure) { // earlySingletonExposure: true
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
                }
    
                this.addSingletonFactory(beanName, new ObjectFactory<Object>() {
                    public Object getObject() throws BeansException {
                        return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean);
                    }
                });
            }
    
            Object exposedObject = bean;
    
            try {
                // beanName: myHelloWorld
                // mbd: Root bean: class [HelloWorld]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [spring-config.xml]
                // instanceWrapper: org.springframework.beans.BeanWrapperImpl: wrapping object [HelloWorld@1190200a]
                this.populateBean(beanName, mbd, instanceWrapper);
                if (exposedObject != null) {
                    exposedObject = this.initializeBean(beanName, exposedObject, mbd);
                }
            } catch (Throwable var18) {
                if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
                    throw (BeanCreationException)var18;
                }
    
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
            }
    
            if (earlySingletonExposure) {
                Object earlySingletonReference = this.getSingleton(beanName, false);
                if (earlySingletonReference != null) {
                    if (exposedObject == bean) {
                        exposedObject = earlySingletonReference;
                    } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
                        String[] dependentBeans = this.getDependentBeans(beanName);
                        Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                        String[] var12 = dependentBeans;
                        int var13 = dependentBeans.length;
    
                        for(int var14 = 0; var14 < var13; ++var14) {
                            String dependentBean = var12[var14];
                            if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                                actualDependentBeans.add(dependentBean);
                            }
                        }
    
                        if (!actualDependentBeans.isEmpty()) {
                            throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                        }
                    }
                }
            }
    
            try {
                this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
                return exposedObject;
            } catch (BeanDefinitionValidationException var16) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
            }
        }    
        
        protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
            PropertyValues pvs = mbd.getPropertyValues(); // pvs: PropertyValues: length=1; bean property 'name'
            if (bw == null) {
                if (!((PropertyValues)pvs).isEmpty()) {
                    throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
                }
            } else {
                boolean continueWithPropertyPopulation = true;
                if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
                    Iterator var6 = this.getBeanPostProcessors().iterator();
    
                    while(var6.hasNext()) {
                        BeanPostProcessor bp = (BeanPostProcessor)var6.next();
                        if (bp instanceof InstantiationAwareBeanPostProcessor) {
                            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                            if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                                continueWithPropertyPopulation = false;
                                break;
                            }
                        }
                    }
                }
    
                if (continueWithPropertyPopulation) {
                    if (mbd.getResolvedAutowireMode() == 1 || mbd.getResolvedAutowireMode() == 2) {
                        MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);
                        if (mbd.getResolvedAutowireMode() == 1) {
                            this.autowireByName(beanName, mbd, bw, newPvs);
                        }
    
                        if (mbd.getResolvedAutowireMode() == 2) {
                            this.autowireByType(beanName, mbd, bw, newPvs);
                        }
    
                        pvs = newPvs;
                    }
    
                    boolean hasInstAwareBpps = this.hasInstantiationAwareBeanPostProcessors();
                    boolean needsDepCheck = mbd.getDependencyCheck() != 0;
                    if (hasInstAwareBpps || needsDepCheck) {
                        PropertyDescriptor[] filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                        if (hasInstAwareBpps) {
                            Iterator var9 = this.getBeanPostProcessors().iterator();
    
                            while(var9.hasNext()) {
                                BeanPostProcessor bp = (BeanPostProcessor)var9.next();
                                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                                    pvs = ibp.postProcessPropertyValues((PropertyValues)pvs, filteredPds, bw.getWrappedInstance(), beanName);
                                    if (pvs == null) {
                                        return;
                                    }
                                }
                            }
                        }
    
                        if (needsDepCheck) {
                            this.checkDependencies(beanName, mbd, filteredPds, (PropertyValues)pvs);
                        }
                    }
    
                    this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
                }
            }
        }    
        
        protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
            if (pvs != null && !pvs.isEmpty()) {
                if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
                    ((BeanWrapperImpl)bw).setSecurityContext(this.getAccessControlContext());
                }
    
                MutablePropertyValues mpvs = null;
                List original;
                if (pvs instanceof MutablePropertyValues) {
                    mpvs = (MutablePropertyValues)pvs;
                    if (mpvs.isConverted()) {
                        try {
                            bw.setPropertyValues(mpvs);
                            return;
                        } catch (BeansException var18) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", var18);
                        }
                    }
    
                    original = mpvs.getPropertyValueList();
                } else {
                    original = Arrays.asList(pvs.getPropertyValues());
                }
    
                TypeConverter converter = this.getCustomTypeConverter();
                if (converter == null) {
                    converter = bw;
                }
    
                BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, (TypeConverter)converter);
                List<PropertyValue> deepCopy = new ArrayList(original.size());
                boolean resolveNecessary = false;
                Iterator var11 = original.iterator();
    
                while(true) {
                    while(var11.hasNext()) {
                        PropertyValue pv = (PropertyValue)var11.next();
                        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 = this.convertForProperty(resolvedValue, propertyName, bw, (TypeConverter)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();
                    }
    
                    try {
                        bw.setPropertyValues(new MutablePropertyValues(deepCopy));
                        return;
                    } catch (BeansException var19) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", var19);
                    }
                }
            }
        }    

    => AbstractPropertyAccessor.class

        public void setPropertyValues(PropertyValues pvs) throws BeansException { // pvs: PropertyValues: length=1; bean property 'name'
            this.setPropertyValues(pvs, false, false);
        }
        
        public void setPropertyValues(PropertyValues pvs, boolean ignoreUnknown, boolean ignoreInvalid) throws BeansException {
            List<PropertyAccessException> propertyAccessExceptions = null;
            List<PropertyValue> propertyValues = pvs instanceof MutablePropertyValues ? ((MutablePropertyValues)pvs).getPropertyValueList() : Arrays.asList(pvs.getPropertyValues());
            Iterator var6 = propertyValues.iterator();
    
            while(var6.hasNext()) {
                PropertyValue pv = (PropertyValue)var6.next();
    
                try {
                    this.setPropertyValue(pv); // pv: bean property 'name'
                } catch (NotWritablePropertyException var9) {
                    if (!ignoreUnknown) {
                        throw var9;
                    }
                } catch (NullValueInNestedPathException var10) {
                    if (!ignoreInvalid) {
                        throw var10;
                    }
                } catch (PropertyAccessException var11) {
                    if (propertyAccessExceptions == null) {
                        propertyAccessExceptions = new LinkedList();
                    }
    
                    propertyAccessExceptions.add(var11);
                }
            }
    
            if (propertyAccessExceptions != null) {
                PropertyAccessException[] paeArray = (PropertyAccessException[])propertyAccessExceptions.toArray(new PropertyAccessException[propertyAccessExceptions.size()]);
                throw new PropertyBatchUpdateException(paeArray);
            }
        }    

    => AbstractNestablePropertyAccessor.class

    public void setPropertyValue(PropertyValue pv) throws BeansException {
            AbstractNestablePropertyAccessor.PropertyTokenHolder tokens = (AbstractNestablePropertyAccessor.PropertyTokenHolder)pv.resolvedTokens;
            if (tokens == null) {
                String propertyName = pv.getName(); // propertyName: name
    
                AbstractNestablePropertyAccessor nestedPa; // nestedPa: org.springframework.beans.BeanWrapperImpl: wrapping object [HelloWorld@1190200a]
                try {
                    nestedPa = this.getPropertyAccessorForPropertyPath(propertyName);
                } catch (NotReadablePropertyException var6) {
                    throw new NotWritablePropertyException(this.getRootClass(), this.nestedPath + propertyName, "Nested property in path '" + propertyName + "' does not exist", var6);
                }
    
                tokens = this.getPropertyNameTokens(this.getFinalPath(nestedPa, propertyName));
                if (nestedPa == this) {
                    pv.getOriginalPropertyValue().resolvedTokens = tokens;
                }
    
                nestedPa.setPropertyValue(tokens, pv);
            } else {
                this.setPropertyValue(tokens, pv);
            }
    
        }    
        
        protected void setPropertyValue(AbstractNestablePropertyAccessor.PropertyTokenHolder tokens, PropertyValue pv) throws BeansException {
            if (tokens.keys != null) {
                this.processKeyedProperty(tokens, pv);
            } else {
                this.processLocalProperty(tokens, pv);
            }
    
        }
        
        private void processLocalProperty(AbstractNestablePropertyAccessor.PropertyTokenHolder tokens, PropertyValue pv) {
            AbstractNestablePropertyAccessor.PropertyHandler ph = this.getLocalPropertyHandler(tokens.actualName);
            if (ph != null && ph.isWritable()) {
                Object oldValue = null;
    
                PropertyChangeEvent propertyChangeEvent;
                try {
                    Object originalValue = pv.getValue();
                    Object valueToApply = originalValue;
                    if (!Boolean.FALSE.equals(pv.conversionNecessary)) {
                        if (pv.isConverted()) {
                            valueToApply = pv.getConvertedValue();
                        } else {
                            if (this.isExtractOldValueForEditor() && ph.isReadable()) {
                                try {
                                    oldValue = ph.getValue();
                                } catch (Exception var8) {
                                    Exception ex = var8;
                                    if (var8 instanceof PrivilegedActionException) {
                                        ex = ((PrivilegedActionException)var8).getException();
                                    }
    
                                    if (logger.isDebugEnabled()) {
                                        logger.debug("Could not read previous value of property '" + this.nestedPath + tokens.canonicalName + "'", ex);
                                    }
                                }
                            }
    
                            valueToApply = this.convertForProperty(tokens.canonicalName, oldValue, originalValue, ph.toTypeDescriptor());
                        }
    
                        pv.getOriginalPropertyValue().conversionNecessary = valueToApply != originalValue;
                    }
    
                    ph.setValue(this.wrappedObject, valueToApply); // wrappedObject: HelloWorld@1531  , valueToApply: Spring
                } catch (TypeMismatchException var9) {
                    throw var9;
                } catch (InvocationTargetException var10) {
                    propertyChangeEvent = new PropertyChangeEvent(this.rootObject, this.nestedPath + tokens.canonicalName, oldValue, pv.getValue());
                    if (var10.getTargetException() instanceof ClassCastException) {
                        throw new TypeMismatchException(propertyChangeEvent, ph.getPropertyType(), var10.getTargetException());
                    } else {
                        Throwable cause = var10.getTargetException();
                        if (cause instanceof UndeclaredThrowableException) {
                            cause = cause.getCause();
                        }
    
                        throw new MethodInvocationException(propertyChangeEvent, cause);
                    }
                } catch (Exception var11) {
                    propertyChangeEvent = new PropertyChangeEvent(this.rootObject, this.nestedPath + tokens.canonicalName, oldValue, pv.getValue());
                    throw new MethodInvocationException(propertyChangeEvent, var11);
                }
            } else if (pv.isOptional()) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Ignoring optional value for property '" + tokens.actualName + "' - property not found on bean class [" + this.getRootClass().getName() + "]");
                }
    
            } else {
                throw this.createNotWritablePropertyException(tokens.canonicalName);
            }
        }

    => BeanWrapperImpl.class

    public void setValue(final Object object, Object valueToApply) throws Exception {
                final Method writeMethod = this.pd instanceof GenericTypeAwarePropertyDescriptor ? ((GenericTypeAwarePropertyDescriptor)this.pd).getWriteMethodForActualAccess() : this.pd.getWriteMethod();
                if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers()) && !writeMethod.isAccessible()) {
                    if (System.getSecurityManager() != null) {
                        AccessController.doPrivileged(new PrivilegedAction<Object>() {
                            public Object run() {
                                writeMethod.setAccessible(true);
                                return null;
                            }
                        });
                    } else {
                        writeMethod.setAccessible(true);
                    }
                }
    
                final Object value = valueToApply;
                if (System.getSecurityManager() != null) {
                    try {
                        AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                            public Object run() throws Exception {
                                writeMethod.invoke(object, value);
                                return null;
                            }
                        }, BeanWrapperImpl.this.acc);
                    } catch (PrivilegedActionException var6) {
                        throw var6.getException();
                    }
                } else {
                    // writeMethod: public void HelloWorld.setName(java.lang.String)
                    // valueToApply : Spring
                    writeMethod.invoke(BeanWrapperImpl.this.getWrappedInstance(), valueToApply);
                }
    }

    => Method.java

    /**
         * Invokes the underlying method represented by this {@code Method}
         * object, on the specified object with the specified parameters.
         * Individual parameters are automatically unwrapped to match
         * primitive formal parameters, and both primitive and reference
         * parameters are subject to method invocation conversions as
         * necessary.
         *
         * <p>If the underlying method is static, then the specified {@code obj}
         * argument is ignored. It may be null.
         *
         * <p>If the number of formal parameters required by the underlying method is
         * 0, the supplied {@code args} array may be of length 0 or null.
         *
         * <p>If the underlying method is an instance method, it is invoked
         * using dynamic method lookup as documented in The Java Language
         * Specification, Second Edition, section 15.12.4.4; in particular,
         * overriding based on the runtime type of the target object will occur.
         *
         * <p>If the underlying method is static, the class that declared
         * the method is initialized if it has not already been initialized.
         *
         * <p>If the method completes normally, the value it returns is
         * returned to the caller of invoke; if the value has a primitive
         * type, it is first appropriately wrapped in an object. However,
         * if the value has the type of an array of a primitive type, the
         * elements of the array are <i>not</i> wrapped in objects; in
         * other words, an array of primitive type is returned.  If the
         * underlying method return type is void, the invocation returns
         * null.
         *
         * @param obj  the object the underlying method is invoked from
         * @param args the arguments used for the method call
         * @return the result of dispatching the method represented by
         * this object on {@code obj} with parameters
         * {@code args}
         *
         * @exception IllegalAccessException    if this {@code Method} object
         *              is enforcing Java language access control and the underlying
         *              method is inaccessible.
         * @exception IllegalArgumentException  if the method is an
         *              instance method and the specified object argument
         *              is not an instance of the class or interface
         *              declaring the underlying method (or of a subclass
         *              or implementor thereof); if the number of actual
         *              and formal parameters differ; if an unwrapping
         *              conversion for primitive arguments fails; or if,
         *              after possible unwrapping, a parameter value
         *              cannot be converted to the corresponding formal
         *              parameter type by a method invocation conversion.
         * @exception InvocationTargetException if the underlying method
         *              throws an exception.
         * @exception NullPointerException      if the specified object is null
         *              and the method is an instance method.
         * @exception ExceptionInInitializerError if the initialization
         * provoked by this method fails.
         */
        @CallerSensitive
        public Object invoke(Object obj, Object... args)
            throws IllegalAccessException, IllegalArgumentException,
               InvocationTargetException
        {
            if (!override) {
                if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                    Class<?> caller = Reflection.getCallerClass();
                    checkAccess(caller, clazz, obj, modifiers);
                }
            }
            MethodAccessor ma = methodAccessor;             // read volatile
            if (ma == null) {
                ma = acquireMethodAccessor();
            }
            return ma.invoke(obj, args); // obj: HelloWorld@1531  , args: Object[1]@1823
        }    
        
        DelegatingMethodAccessorImpl.class
        public Object invoke(Object var1, Object[] var2) throws IllegalArgumentException, InvocationTargetException {
            return this.delegate.invoke(var1, var2);
        }

    => NativeMethodAccessorImpl.class

        public Object invoke(Object var1, Object[] var2) throws IllegalArgumentException, InvocationTargetException {
            if (++this.numInvocations > ReflectionFactory.inflationThreshold() && !ReflectUtil.isVMAnonymousClass(this.method.getDeclaringClass())) {
                MethodAccessorImpl var3 = (MethodAccessorImpl)(new MethodAccessorGenerator()).generateMethod(this.method.getDeclaringClass(), this.method.getName(), this.method.getParameterTypes(), this.method.getReturnType(), this.method.getExceptionTypes(), this.method.getModifiers());
                this.parent.setDelegate(var3);
            }
    
            return invoke0(this.method, var1, var2);
        }
    
        private static native Object invoke0(Method var0, Object var1, Object[] var2);    

    跳转到了自定义类 HelloWorld.java 的 setName的部分

  • 相关阅读:
    linux下的开源移动图像监测程序--motion编译与配置【转】
    motion程序的移植和安装【转】
    Android5.1 在init.rc 中添加自己的服务【转】
    Android进程回收机制LMK(Low Memory Killer)【转】
    Linux内核OOM机制的详细分析【转】
    Android——build.prop 解析【转】
    Android——build.prop 解析【转】
    【转】ios的控件UIScrollView的位置定位---------逐渐积累
    【转】IOS图像拉伸解决方案
    【转】NSString属性什么时候用copy,什么时候用strong?
  • 原文地址:https://www.cnblogs.com/Wicher-lsl/p/10856325.html
Copyright © 2020-2023  润新知