1. instanceWrapper = createBeanInstance(beanName, mbd, args);
  2.  
  3. AbstractAutowireCapableBeanFactory.createBeanInstance
  4.  
  5. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
  6. // Make sure bean class is actually resolved at this point.确保实际已经解析了beanClass,如果是表达式,会进行表达式的运算得到className
  7. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  8.  
  9. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  10. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  11. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
  12. }
  13.  
  14. //如果存在工厂方法,那么说明需要通过静态工厂的方式获取bean
  15. if (mbd.getFactoryMethodName() != null) {
  16. return instantiateUsingFactoryMethod(beanName, mbd, args);
  17. }
  18.  
  19. // Shortcut when re-creating the same bean...
  20. boolean resolved = false;
  21. boolean autowireNecessary = false;
  22. if (args == null) {
  23. synchronized (mbd.constructorArgumentLock) {
  24. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  25. resolved = true;
  26. autowireNecessary = mbd.constructorArgumentsResolved;
  27. }
  28. }
  29. }
  30. if (resolved) {
  31. if (autowireNecessary) {
  32. return autowireConstructor(beanName, mbd, null, null);
  33. }
  34. else {
  35. return instantiateBean(beanName, mbd);
  36. }
  37. }
  38.  
  39. // Need to determine the constructor...
  40. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  41. if (ctors != null ||
  42. mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
  43. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  44. return autowireConstructor(beanName, mbd, ctors, args);
  45. }
  46.  
  47. // No special handling: simply use no-arg constructor.
  48. return instantiateBean(beanName, mbd);
  49. }
  50.  
  51. AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod
  52.  
  53. protected BeanWrapper instantiateUsingFactoryMethod(
  54. String beanName, RootBeanDefinition mbd, Object[] explicitArgs) {
  55.  
  56. return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);
  57. }
  58.  
  59. ConstructorResolver.instantiateUsingFactoryMethod
  60.  
  61. public BeanWrapper instantiateUsingFactoryMethod(
  62. final String beanName, final RootBeanDefinition mbd, final Object[] explicitArgs) {
  63.  
  64. BeanWrapperImpl bw = new BeanWrapperImpl();
  65. //初始化这个bean包装器,内部给这个包装器设置了类型转化器和自定的转化器
  66. this.beanFactory.initBeanWrapper(bw);
  67.  
  68. Object factoryBean;
  69. Class<?> factoryClass;
  70. boolean isStatic;
  71.  
  72. String factoryBeanName = mbd.getFactoryBeanName();
  73. //如果存在factoryBeanName 比如<bean id="helloWorld" factory-bean="helloWorld" factory-method="getSayHi"></bean>
  74. if (factoryBeanName != null) {
  75. //如果工厂bean的名字和自己相同,那么直接抛错
  76. if (factoryBeanName.equals(beanName)) {
  77. throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName,
  78. "factory-bean reference points back to the same bean definition");
  79. }
  80. //使用getBean获取到依赖的那个工厂bean
  81. factoryBean = this.beanFactory.getBean(factoryBeanName);
  82. if (factoryBean == null) {
  83. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  84. "factory-bean '" + factoryBeanName + "' (or a BeanPostProcessor involved) returned null");
  85. }
  86. if (mbd.isSingleton() && this.beanFactory.containsSingleton(beanName)) {
  87. throw new IllegalStateException("About-to-be-created singleton instance implicitly appeared " +
  88. "through the creation of the factory bean that its bean definition points to");
  89. }
  90. factoryClass = factoryBean.getClass();
  91. isStatic = false;
  92. }
  93. else {
  94. // It's a static factory method on the bean class.
  95. if (!mbd.hasBeanClass()) {
  96. throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName,
  97. "bean definition declares neither a bean class nor a factory-bean reference");
  98. }
  99. factoryBean = null;
  100. factoryClass = mbd.getBeanClass();
  101. isStatic = true;
  102. }
  103.  
  104. Method factoryMethodToUse = null;
  105. ArgumentsHolder argsHolderToUse = null;
  106. Object[] argsToUse = null;
  107. //如果用户已经指定了构造参数,那么直接使用用户指定的构造参数
  108. if (explicitArgs != null) {
  109. argsToUse = explicitArgs;
  110. }
  111. else {
  112. Object[] argsToResolve = null;
  113. synchronized (mbd.constructorArgumentLock) {
  114. //获取已经解析后的构造器或者工厂方法
  115. factoryMethodToUse = (Method) mbd.resolvedConstructorOrFactoryMethod;
  116. //如果已经解析好了,那么尝试从缓存中获取参数
  117. if (factoryMethodToUse != null && mbd.constructorArgumentsResolved) {
  118. // Found a cached factory method...
  119. argsToUse = mbd.resolvedConstructorArguments;
  120. //如果缓存中没有,那么就从准备的(也就是解析配置文件时,BeanDefinition存储的参数)构造参数中获取,这个时候的参数还是原始(配置文件中)的,没有进行类型转换的参数
  121. if (argsToUse == null) {
  122. argsToResolve = mbd.preparedConstructorArguments;
  123. }
  124. }
  125. }
  126. if (argsToResolve != null) {
  127. //解析准备的配置参数
  128. argsToUse = resolvePreparedArguments(beanName, mbd, bw, factoryMethodToUse, argsToResolve);
  129. }
  130. }
  131. //如果没有缓存,那么说明这是第一次访问,需要从头开始解析
  132. if (factoryMethodToUse == null || argsToUse == null) {
  133. // Need to determine the factory method...
  134. // Try all methods with this name to see if they match the given arguments.
  135. //判断是否被cglib代理过的,如果代理过,那么就返回其父类
  136. factoryClass = ClassUtils.getUserClass(factoryClass);
  137. //获取这个类定义的所有方法
  138. Method[] rawCandidates = getCandidateMethods(factoryClass, mbd);
  139. List<Method> candidateSet = new ArrayList<Method>();
  140. for (Method candidate : rawCandidates) {
  141. //获取工厂方法
  142. if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate)) {
  143. candidateSet.add(candidate);
  144. }
  145. }
  146. Method[] candidates = candidateSet.toArray(new Method[candidateSet.size()]);
  147. //给重载的方法排序,public修饰和参数长的排在前面
  148. AutowireUtils.sortFactoryMethods(candidates);
  149.  
  150. ConstructorArgumentValues resolvedValues = null;
  151. boolean autowiring = (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
  152. int minTypeDiffWeight = Integer.MAX_VALUE;
  153. Set<Method> ambiguousFactoryMethods = null;
  154.  
  155. int minNrOfArgs;
  156. if (explicitArgs != null) {
  157. minNrOfArgs = explicitArgs.length;
  158. }
  159. else {
  160. // We don't have arguments passed in programmatically, so we need to resolve the
  161. // arguments specified in the constructor arguments held in the bean definition.
  162. //如果用户没有传递参数进来,那么我们需要获取配置的参数
  163. ConstructorArgumentValues cargs = mbd.getConstructorArgumentValues();
  164. resolvedValues = new ConstructorArgumentValues();
  165. //解析构造参数,通过BeanDefinitionValueResolver进行解析,解析好后放置到resolvedValues中,这里主要是将beanref的解析好和以下表达式什么的,没有进行参数类型的转换。
  166. minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
  167. }
  168.  
  169. List<Exception> causes = null;
  170.  
  171. for (int i = 0; i < candidates.length; i++) {
  172. Method candidate = candidates[i];
  173. //获取当前方法的参数类型
  174. Class<?>[] paramTypes = candidate.getParameterTypes();
  175.  
  176. if (paramTypes.length >= minNrOfArgs) {
  177. ArgumentsHolder argsHolder;
  178.  
  179. if (resolvedValues != null) {
  180. // Resolved constructor arguments: type conversion and/or autowiring necessary.
  181. try {
  182. //获取这些方法的参数名
  183. String[] paramNames = null;
  184. ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
  185. if (pnd != null) {
  186. paramNames = pnd.getParameterNames(candidate);
  187. }
  188. //由于实际方法的参数和配置的参数之间存在位置,类型需要转化的问题,所以需要尝试换成符合对应方法的参数
  189. argsHolder = createArgumentArray(
  190. beanName, mbd, resolvedValues, bw, paramTypes, paramNames, candidate, autowiring);
  191. }
  192. catch (UnsatisfiedDependencyException ex) {
  193. if (this.beanFactory.logger.isTraceEnabled()) {
  194. this.beanFactory.logger.trace("Ignoring factory method [" + candidate +
  195. "] of bean '" + beanName + "': " + ex);
  196. }
  197. if (i == candidates.length - 1 && argsHolderToUse == null) {
  198. if (causes != null) {
  199. for (Exception cause : causes) {
  200. this.beanFactory.onSuppressedException(cause);
  201. }
  202. }
  203. throw ex;
  204. }
  205. else {
  206. // Swallow and try next overloaded factory method.
  207. if (causes == null) {
  208. causes = new LinkedList<Exception>();
  209. }
  210. causes.add(ex);
  211. continue;
  212. }
  213. }
  214. }
  215.  
  216. else {
  217. //如果配置里面没有参数,那么就使用用户设置的参数
  218. // Explicit arguments given -> arguments length must match exactly.
  219. if (paramTypes.length != explicitArgs.length) {
  220. continue;
  221. }
  222. argsHolder = new ArgumentsHolder(explicitArgs);
  223. }
  224.  
  225. int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
  226. argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
  227. // Choose this factory method if it represents the closest match.
  228. if (typeDiffWeight < minTypeDiffWeight) {
  229. factoryMethodToUse = candidate;
  230. argsHolderToUse = argsHolder;
  231. argsToUse = argsHolder.arguments;
  232. minTypeDiffWeight = typeDiffWeight;
  233. ambiguousFactoryMethods = null;
  234. }
  235. // Find out about ambiguity: In case of the same type difference weight
  236. // for methods with the same number of parameters, collect such candidates
  237. // and eventually raise an ambiguity exception.
  238. // However, only perform that check in non-lenient constructor resolution mode,
  239. // and explicitly ignore overridden methods (with the same parameter signature).
  240. else if (factoryMethodToUse != null && typeDiffWeight == minTypeDiffWeight &&
  241. !mbd.isLenientConstructorResolution() &&
  242. paramTypes.length == factoryMethodToUse.getParameterTypes().length &&
  243. !Arrays.equals(paramTypes, factoryMethodToUse.getParameterTypes())) {
  244. if (ambiguousFactoryMethods == null) {
  245. ambiguousFactoryMethods = new LinkedHashSet<Method>();
  246. ambiguousFactoryMethods.add(factoryMethodToUse);
  247. }
  248. ambiguousFactoryMethods.add(candidate);
  249. }
  250. }
  251. }
  252.  
  253. if (factoryMethodToUse == null) {
  254. List<String> argTypes = new ArrayList<String>(minNrOfArgs);
  255. if (explicitArgs != null) {
  256. for (Object arg : explicitArgs) {
  257. argTypes.add(arg != null ? arg.getClass().getSimpleName() : "null");
  258. }
  259. }
  260. else {
  261. Set<ValueHolder> valueHolders = new LinkedHashSet<ValueHolder>(resolvedValues.getArgumentCount());
  262. valueHolders.addAll(resolvedValues.getIndexedArgumentValues().values());
  263. valueHolders.addAll(resolvedValues.getGenericArgumentValues());
  264. for (ValueHolder value : valueHolders) {
  265. String argType = (value.getType() != null ? ClassUtils.getShortName(value.getType()) :
  266. (value.getValue() != null ? value.getValue().getClass().getSimpleName() : "null"));
  267. argTypes.add(argType);
  268. }
  269. }
  270. String argDesc = StringUtils.collectionToCommaDelimitedString(argTypes);
  271. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  272. "No matching factory method found: " +
  273. (mbd.getFactoryBeanName() != null ?
  274. "factory bean '" + mbd.getFactoryBeanName() + "'; " : "") +
  275. "factory method '" + mbd.getFactoryMethodName() + "(" + argDesc + ")'. " +
  276. "Check that a method with the specified name " +
  277. (minNrOfArgs > 0 ? "and arguments " : "") +
  278. "exists and that it is " +
  279. (isStatic ? "static" : "non-static") + ".");
  280. }
  281. else if (void.class == factoryMethodToUse.getReturnType()) {
  282. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  283. "Invalid factory method '" + mbd.getFactoryMethodName() +
  284. "': needs to have a non-void return type!");
  285. }
  286. else if (ambiguousFactoryMethods != null) {
  287. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  288. "Ambiguous factory method matches found in bean '" + beanName + "' " +
  289. "(hint: specify index/type/name arguments for simple parameters to avoid type ambiguities): " +
  290. ambiguousFactoryMethods);
  291. }
  292.  
  293. if (explicitArgs == null && argsHolderToUse != null) {
  294. argsHolderToUse.storeCache(mbd, factoryMethodToUse);
  295. }
  296. }
  297.  
  298. try {
  299. Object beanInstance;
  300.  
  301. if (System.getSecurityManager() != null) {
  302. final Object fb = factoryBean;
  303. final Method factoryMethod = factoryMethodToUse;
  304. final Object[] args = argsToUse;
  305. beanInstance = AccessController.doPrivileged(new PrivilegedAction<Object>() {
  306. @Override
  307. public Object run() {
  308. return beanFactory.getInstantiationStrategy().instantiate(
  309. mbd, beanName, beanFactory, fb, factoryMethod, args);
  310. }
  311. }, beanFactory.getAccessControlContext());
  312. }
  313. else {
  314. beanInstance = this.beanFactory.getInstantiationStrategy().instantiate(
  315. mbd, beanName, this.beanFactory, factoryBean, factoryMethodToUse, argsToUse);
  316. }
  317.  
  318. if (beanInstance == null) {
  319. return null;
  320. }
  321. bw.setWrappedInstance(beanInstance);
  322. return bw;
  323. }
  324. catch (Throwable ex) {
  325. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  326. "Bean instantiation via factory method failed", ex);
  327. }
  328. }
  329.  
  330. ConstructorResolver.resolvePreparedArguments
  331.  
  332. private Object[] resolvePreparedArguments(
  333. String beanName, RootBeanDefinition mbd, BeanWrapper bw, Member methodOrCtor, Object[] argsToResolve) {
  334. //获取构造方法或者工厂方法的参数类型
  335. Class<?>[] paramTypes = (methodOrCtor instanceof Method ?
  336. ((Method) methodOrCtor).getParameterTypes() : ((Constructor<?>) methodOrCtor).getParameterTypes());
  337. //获取自定义的类型转化器,如果没有就是用bean包装器·,这个包装器在上面已经注册了默认的转化器和自定的转化器。
  338. TypeConverter converter = (this.beanFactory.getCustomTypeConverter() != null ?
  339. this.beanFactory.getCustomTypeConverter() : bw);、
  340. //构建BeanDefinition值的解析器,用于转化value
  341. BeanDefinitionValueResolver valueResolver =
  342. new BeanDefinitionValueResolver(this.beanFactory, beanName, mbd, converter);
  343. Object[] resolvedArgs = new Object[argsToResolve.length];
  344. for (int argIndex = 0; argIndex < argsToResolve.length; argIndex++) {
  345. //获取当前下标参数值
  346. Object argValue = argsToResolve[argIndex];
  347. //包装成方法参数对象,持有对应的方法,参数的位置
  348. MethodParameter methodParam = MethodParameter.forMethodOrConstructor(methodOrCtor, argIndex);
  349. //解析这个方法所在的类,参数的类型
  350. GenericTypeResolver.resolveParameterType(methodParam, methodOrCtor.getDeclaringClass());
  351. //参数是AutowiredArgumentMarker只只是个标记类,标记为自动装配的参数,这里会解析@Value注解的参数,还有会根据字段的类型去包装成某些延迟获取数据的对象,比如DependencyObjectFactory(依赖工厂bean,这种类型字段可以通过getObject获取数据),这里是方法参数的获取所以不用去管field的。最后内部会通过DefaultListableBeanFactory.doResolveDependency方法根据参数类型去获取bean
  352. if (argValue instanceof AutowiredArgumentMarker) {
  353. argValue = resolveAutowiredArgument(methodParam, beanName, null, converter);
  354. }
  355. //这种类型数据一般是在解析xml配置的时候生成的,比如xml中的ref指定的bean会包装成RuntimeBeanReference,当spring看到这种类型的时候就知道,我要去BeanFactory中寻找叫这个名字的bean
  356. else if (argValue instanceof BeanMetadataElement) {
  357. //使用上面new出来的BeanDefinitionValueResolver进行解析
  358. argValue = valueResolver.resolveValueIfNecessary("constructor argument", argValue);
  359. }
  360. //如果只是普通的字符串,那么经过表达式解析器之后直接返回
  361. else if (argValue instanceof String) {
  362. argValue = this.beanFactory.evaluateBeanDefinitionString((String) argValue, mbd);
  363. }
  364. Class<?> paramType = paramTypes[argIndex];
  365. try {
  366. //将得到的数据进行类型转换
  367. resolvedArgs[argIndex] = converter.convertIfNecessary(argValue, paramType, methodParam);
  368. }
  369. catch (TypeMismatchException ex) {
  370. String methodType = (methodOrCtor instanceof Constructor ? "constructor" : "factory method");
  371. throw new UnsatisfiedDependencyException(
  372. mbd.getResourceDescription(), beanName, argIndex, paramType,
  373. "Could not convert " + methodType + " argument value of type [" +
  374. ObjectUtils.nullSafeClassName(argValue) +
  375. "] to required type [" + paramType.getName() + "]: " + ex.getMessage());
  376. }
  377. }
  378. //返回解析好的参数
  379. return resolvedArgs;
  380. }
  381.  
  382. DefaultListableBeanFactory.resolveDependency
  383.  
  384. public Object resolveDependency(DependencyDescriptor descriptor, String beanName,
  385. Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
  386. //获取参数名
  387. descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
  388. //如果对应的字段或参数类型是Option类型的,那么创建Option,对应的值用get获取,其实内部的值依然是调用 doResolveDependency获取的
  389. if (descriptor.getDependencyType().equals(javaUtilOptionalClass)) {
  390. return new OptionalDependencyFactory().createOptionalDependency(descriptor, beanName);
  391. }
  392. //如果这个字段或参数是对象工厂,那么返回依赖工厂,对应的值用个getObject获取
  393. else if (ObjectFactory.class == descriptor.getDependencyType()) {
  394. return new DependencyObjectFactory(descriptor, beanName);
  395. }
  396. //如果这个字段或参数类型为javax.inject.Provider,那么返回DependencyProvider,通过get获取值
  397. else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
  398. return new DependencyProviderFactory().createDependencyProvider(descriptor, beanName);
  399. }
  400. else {
  401. Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, beanName);
  402. if (result == null) {
  403. //解析依赖
  404. result = doResolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter);
  405. }
  406. return result;
  407. }
  408. }
  409.  
  410. DefaultListableBeanFactory.doResolveDependency
  411.  
  412. public Object doResolveDependency(DependencyDescriptor descriptor, String beanName,
  413. Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
  414. //获取字段或方法参数的类型
  415. Class<?> type = descriptor.getDependencyType();
  416. //获取@Value注解的值
  417. Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
  418. if (value != null) {
  419. if (value instanceof String) {
  420. //如果从@Value中获取到了数据,那么就解析${}占位符。
  421. String strVal = resolveEmbeddedValue((String) value);
  422. BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);
  423. //动态语言解析
  424. value = evaluateBeanDefinitionString(strVal, bd);
  425. }
  426. TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
  427. //转换类型后返回
  428. return (descriptor.getField() != null ?
  429. converter.convertIfNecessary(value, type, descriptor.getField()) :
  430. converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));
  431. }
  432. //如果是数组,那么获取到对应数组类型,然后到BeanFactory中获取到对应的类型
  433. if (type.isArray()) {
  434. Class<?> componentType = type.getComponentType();
  435. DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
  436. targetDesc.increaseNestingLevel();
  437. //获取符合类型的候选的对象
  438. Map<String, Object> matchingBeans = findAutowireCandidates(beanName, componentType, targetDesc);
  439. if (matchingBeans.isEmpty()) {
  440. //如果这个字段或参数是必须的,又没有值,那么只好报错了
  441. if (descriptor.isRequired()) {
  442. raiseNoSuchBeanDefinitionException(componentType, "array of " + componentType.getName(), descriptor);
  443. }
  444. return null;
  445. }
  446. if (autowiredBeanNames != null) {
  447. autowiredBeanNames.addAll(matchingBeans.keySet());
  448. }
  449. TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
  450. //转换类型
  451. Object result = converter.convertIfNecessary(matchingBeans.values(), type);
  452. if (getDependencyComparator() != null && result instanceof Object[]) {
  453. Arrays.sort((Object[]) result, adaptDependencyComparator(matchingBeans));
  454. }
  455. return result;
  456. }
  457. //处理集合类型
  458. else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
  459. Class<?> elementType = descriptor.getCollectionType();
  460. if (elementType == null) {
  461. if (descriptor.isRequired()) {
  462. throw new FatalBeanException("No element type declared for collection [" + type.getName() + "]");
  463. }
  464. return null;
  465. }
  466. DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
  467. targetDesc.increaseNestingLevel();
  468. Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType, targetDesc);
  469. if (matchingBeans.isEmpty()) {
  470. if (descriptor.isRequired()) {
  471. raiseNoSuchBeanDefinitionException(elementType, "collection of " + elementType.getName(), descriptor);
  472. }
  473. return null;
  474. }
  475. if (autowiredBeanNames != null) {
  476. autowiredBeanNames.addAll(matchingBeans.keySet());
  477. }
  478. TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
  479. Object result = converter.convertIfNecessary(matchingBeans.values(), type);
  480. if (getDependencyComparator() != null && result instanceof List) {
  481. Collections.sort((List<?>) result, adaptDependencyComparator(matchingBeans));
  482. }
  483. return result;
  484. }
  485. //处理Map类型
  486. else if (Map.class.isAssignableFrom(type) && type.isInterface()) {
  487. Class<?> keyType = descriptor.getMapKeyType();
  488. if (String.class != keyType) {
  489. if (descriptor.isRequired()) {
  490. throw new FatalBeanException("Key type [" + keyType + "] of map [" + type.getName() +
  491. "] must be [java.lang.String]");
  492. }
  493. return null;
  494. }
  495. Class<?> valueType = descriptor.getMapValueType();
  496. if (valueType == null) {
  497. if (descriptor.isRequired()) {
  498. throw new FatalBeanException("No value type declared for map [" + type.getName() + "]");
  499. }
  500. return null;
  501. }
  502. DependencyDescriptor targetDesc = new DependencyDescriptor(descriptor);
  503. targetDesc.increaseNestingLevel();
  504. Map<String, Object> matchingBeans = findAutowireCandidates(beanName, valueType, targetDesc);
  505. if (matchingBeans.isEmpty()) {
  506. if (descriptor.isRequired()) {
  507. raiseNoSuchBeanDefinitionException(valueType, "map with value type " + valueType.getName(), descriptor);
  508. }
  509. return null;
  510. }
  511. if (autowiredBeanNames != null) {
  512. autowiredBeanNames.addAll(matchingBeans.keySet());
  513. }
  514. return matchingBeans;
  515. }
  516. else {
  517. Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
  518. if (matchingBeans.isEmpty()) {
  519. if (descriptor.isRequired()) {
  520. raiseNoSuchBeanDefinitionException(type, "", descriptor);
  521. }
  522. return null;
  523. }
  524. //如果匹配的bean大于一个,那么就查看是否配置了primary属性,如果有就使用primary的那个,没有就报错。
  525. if (matchingBeans.size() > 1) {
  526. String primaryBeanName = determineAutowireCandidate(matchingBeans, descriptor);
  527. if (primaryBeanName == null) {
  528. throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet());
  529. }
  530. if (autowiredBeanNames != null) {
  531. autowiredBeanNames.add(primaryBeanName);
  532. }
  533. return matchingBeans.get(primaryBeanName);
  534. }
  535. // We have exactly one match.
  536. Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
  537. if (autowiredBeanNames != null) {
  538. autowiredBeanNames.add(entry.getKey());
  539. }
  540. return entry.getValue();
  541. }
  542. }

bean的创建(五)第二部分 寻找bean的工厂方法实例化的更多相关文章

  1. 创建类模式(一):工厂方法(Factory Method)

    定义 此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦.复用和方便后期维护拓展的目的. 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心 ...

  2. Spring 源码(17)Spring Bean的创建过程(8)Bean的初始化

    知识回顾 Bean的创建过程会经历getBean,doGetBean,createBean,doCreateBean,然后Bean的创建又会经历实例化,属性填充,初始化. 在实例化createInst ...

  3. IoC容器装配Bean(xml配置方式)(Bean的生命周期)

    1.Spring管理Bean,实例化Bean对象 三种方式 第一种:使用类构造器实例化(默认无参数) package cn.itcast.spring.initbean; /** * 使用构造方法 实 ...

  4. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  5. 0003 - 基于xml的Spring Bean 的创建过程

    一.目录 前言 创建 Bean 容器 加载 Bean 定义 创建 Bean Spring Bean 创建过程中的设计模式 总结 二.前言 2.1 Spring 使用配置 ApplicationCont ...

  6. Spring Bean学习创建及使用<一>

    转自:http://glzaction.iteye.com/blog/1299441 Spring中依赖注入有三种注入方式: 一.构造器注入: 二.设值注入(setter方式注入): 三.Feild方 ...

  7. Spring学习--静态工厂方法、实例工厂方法创建 Bean

    通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...

  8. Spring5参考指南:Bean的创建

    文章目录 Spring容器中的Bean Bean的命名 Bean的实例化 Spring容器中的Bean Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能. 在 ...

  9. Spring 源码(11)Spring Bean 的创建过程(2)

    Spring Bean 的创建过程介绍了FactoryBean 的创建方式,那么接下来介绍不是FactoryBean的创建方式,在创建过程中,又会分为单例的Bean的创建,原型类型的Bean的创建等. ...

随机推荐

  1. Laravel --- 【转】安装调试利器 Laravel Debugbar

    [转]http://www.tuicool.com/articles/qYfmmur 1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显 ...

  2. 关于exe4j打包问题

    一.eclipse导出jar Export-->Runnable JAR file 这里有两种情况: 选择 Package required libraries into generated j ...

  3. spring源码深度解析— IOC 之 默认标签解析(下)

    在spring源码深度解析— IOC 之 默认标签解析(上)中我们已经完成了从xml配置文件到BeanDefinition的转换,转换后的实例是GenericBeanDefinition的实例.本文主 ...

  4. Centos7.6 双网卡,修改默认路由

    centos修改默认路由 需求:服务器有两个网卡,一个是内网网卡,一个是外网网卡,但是默认的路由是内网: route -n 列出所有路由: 删除默认的路由: route del default gw ...

  5. Spring Boot2(九):整合Jpa的基本使用

    一.前言 今天早上看到一篇微信文章,说的是国内普遍用的Mybatis,而国外确普遍用的是Jpa.我之前也看了jpa,发现入门相当容易.jpa对于简单的CRUD支持非常好,开发效率也会比Mybatis高 ...

  6. BZOJ 3289:Mato的文件管理(莫队算法+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话 ...

  7. Java学习笔记之---构造方法

    Java学习笔记之---构造方法 (一)构造方法的特性 构造方法不能被对象单独调用 构造方法与类同名且没有返回值 构造方法只能在对象实例化的时候被调用 当没有指定构造方法时,系统会自动添加无参的构造方 ...

  8. STM32F0_HAL库驱动描述——HAL驱动程序概述

    HAL库文件结构: HAL驱动文件: 外设驱动API文件和头文件:包含了常见主要的通用API,其中ppp表示外设名称,如adc.usart.gpio.irda等: stm32f0xx_hal_ppp. ...

  9. 【题解】危险的工作-C++

    Description 给出一个数字N,N<=11.代表有N个人分担N个危险的工作. 每个人对应每个工作,有个危险值 每个人担任其中一项,问每个人危险值相加,最小值是多少. Input 第一行给 ...

  10. mvc区分页面内请求判断是否是Html.action或Html.RenderAction请求

    ControllerContext.IsChildAction 来判断,如果用Html.Action或Html.RenderAction方法,这个属性返回true,否则返回false