Spring 推断构造方法

方法:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors

 
 1 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors
 2 
 3 // Quick check on the concurrent map first, with minimal locking.
 4 Constructor<?>[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);
 5 if (candidateConstructors == null) {
 6    // Fully synchronized resolution now...
 7    synchronized (this.candidateConstructorsCache) {
 8       candidateConstructors = this.candidateConstructorsCache.get(beanClass);
 9       if (candidateConstructors == null) {
10          Constructor<?>[] rawCandidates;
11          try {
12 //获取该class中的构造方法
13             rawCandidates = beanClass.getDeclaredConstructors();
14          }
15          catch (Throwable ex) {
16             throw new BeanCreationException(beanName,
17                   "Resolution of declared constructors on bean Class [" + beanClass.getName() +
18                   "] from ClassLoader [" + beanClass.getClassLoader() + "] failed", ex);
19          }
20          List<Constructor<?>> candidates = new ArrayList<Constructor<?>>(rawCandidates.length);
21          Constructor<?> requiredConstructor = null;
22          Constructor<?> defaultConstructor = null;
23          for (Constructor<?> candidate : rawCandidates) {
24 //在构造方法上查看是否有@Autowired
25             AnnotationAttributes ann = findAutowiredAnnotation(candidate);
26             if (ann == null) {
27                Class<?> userClass = ClassUtils.getUserClass(beanClass);
28                if (userClass != beanClass) {
29                   try {
30                      Constructor<?> superCtor =
31                            userClass.getDeclaredConstructor(candidate.getParameterTypes());
32                      ann = findAutowiredAnnotation(superCtor);
33                   }
34                   catch (NoSuchMethodException ex) {
35                      // Simply proceed, no equivalent superclass constructor found...
36                   }
37                }
38             }
39             if (ann != null) {
40                if (requiredConstructor != null) {
41                   throw new BeanCreationException(beanName,
42                         "Invalid autowire-marked constructor: " + candidate +
43                         ". Found constructor with 'required' Autowired annotation already: " +
44                         requiredConstructor);
45                }
46                boolean required = determineRequiredStatus(ann);
47                if (required) {
48                   if (!candidates.isEmpty()) {
49                      throw new BeanCreationException(beanName,
50                            "Invalid autowire-marked constructors: " + candidates +
51                            ". Found constructor with 'required' Autowired annotation: " +
52                            candidate);
53                   }
54            //1.如果既有@Autowired ,required=true。则赋值给requiredConstructor 
55                   requiredConstructor = candidate;
56                }
57          //并添加到candidates
58                candidates.add(candidate);
59             }
60             else if (candidate.getParameterTypes().length == 0) {
61                defaultConstructor = candidate;
62             }
63          }
64          if (!candidates.isEmpty()) {
65             // Add default constructor to list of optional constructors, as fallback.
66             if (requiredConstructor == null) {
67                if (defaultConstructor != null) {
68            //2.如果只有默认,没有required=true ,也添加到candidates
69                   candidates.add(defaultConstructor);
70                }
71                else if (candidates.size() == 1 && logger.isWarnEnabled()) {
72                   logger.warn("Inconsistent constructor declaration on bean with name '" + beanName +
73                         "': single autowire-marked constructor flagged as optional - " +
74                         "this constructor is effectively required since there is no " +
75                         "default constructor to fall back to: " + candidates.get(0));
76                }
77             }
78             candidateConstructors = candidates.toArray(new Constructor<?>[candidates.size()]);
79          }
80      //3.如果该方法只有一个构造方法。并且参数大于零。也把他加入candidates
81          else if (rawCandidates.length == 1 && rawCandidates[0].getParameterTypes().length > 0) {
82             candidateConstructors = new Constructor<?>[] {rawCandidates[0]};
83          }
84          else {
85        //4.否则就没有构造方法。
86             candidateConstructors = new Constructor<?>[0];
87          }
88          this.candidateConstructorsCache.put(beanClass, candidateConstructors);
89       }
90    }
91 }
92 return (candidateConstructors.length > 0 ? candidateConstructors : null);

 

posted @ 2020-11-16 17:42  Didi_Liu  阅读(446)  评论(0编辑  收藏  举报