Spring 创建Bean实例源码
1
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { // 工厂Bean缓存中获取 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 实例化Bean instanceWrapper = createBeanInstance(beanName, mbd, args); } Object bean = instanceWrapper.getWrappedInstance(); Class<?> beanType = instanceWrapper.getWrappedClass(); if (beanType != NullBean.class) { mbd.resolvedTargetType = beanType; } ...省略 return exposedObject; }
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 解析Bean 的Class Class<?> beanClass = resolveBeanClass(mbd, beanName); // 判断class不为空,并且访问权限是public if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName()); } // 获取 Supplier 接口,来创建 Bean 实例 Supplier<?> instanceSupplier = mbd.getInstanceSupplier(); if (instanceSupplier != null) { return obtainFromSupplier(instanceSupplier, beanName); } // 获取 工厂方法,来创建 Bean 实例 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); } // 通过构造方法来创建 Bean 实例 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) { // 构造函数自动注入 return autowireConstructor(beanName, mbd, null, null); } else { // 默认构造函数构造 return instantiateBean(beanName, mbd); } } // 如果上面没找到有效的构造函数,就从BeanPostProcessor中查找,然后执行返回 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } // 获取首选的构造方法,执行返回 ctors = mbd.getPreferredConstructors(); if (ctors != null) { return autowireConstructor(beanName, mbd, ctors, null); } // 默认构造函数构造 return instantiateBean(beanName, mbd); }
protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) { try { Object beanInstance; if (System.getSecurityManager() != null) { beanInstance = AccessController.doPrivileged( (PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this), getAccessControlContext()); } else { // 获取实例化策略并且进行实例化操作 beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this); } // 包装成BeanWrapper BeanWrapper bw = new BeanWrapperImpl(beanInstance); initBeanWrapper(bw); return bw; } catch (Throwable ex) { throw new BeanCreationException( mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex); } } // 通过反射生成实例化对象 public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { // 如果没有重写,不要用CGLIB重写类 // 没有MethodOverrides对象,可以直接实例化 if (!bd.hasMethodOverrides()) { Constructor<?> constructorToUse; // 锁定对象,使获得实例化构造方法线程安全 synchronized (bd.constructorArgumentLock) { // 查看bd对象里使用否含有构造方法 constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod; if (constructorToUse == null) { final Class<?> clazz = bd.getBeanClass(); // 如果要实例化的beanDefinition是一个接口,则直接抛出异常 if (clazz.isInterface()) { throw new BeanInstantiationException(clazz, "Specified class is an interface"); } try { // 获取系统安全管理器 if (System.getSecurityManager() != null) { constructorToUse = AccessController.doPrivileged( (PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor); } else { // 获取声明的构造函数 constructorToUse = clazz.getDeclaredConstructor(); } bd.resolvedConstructorOrFactoryMethod = constructorToUse; } catch (Throwable ex) { throw new BeanInstantiationException(clazz, "No default constructor found", ex); } } } // 通过反射生成实例化对象 return BeanUtils.instantiateClass(constructorToUse); } else { // 必须生成cglib子类 return instantiateWithMethodInjection(bd, beanName, owner); } }
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号