1. 程式人生 > >spring註解原始碼分析-解析和注入註解配置的資源

spring註解原始碼分析-解析和注入註解配置的資源

類內部的註解,如@Autowire、@Value、@Required、@Resource以及EJB和WebService相關的註解,是容器對Bean例項化和依賴注入時,通過容器中註冊的Bean後置處理處理這些註解的。

當使用Spring的註解功能時,

<context:annotation-config>  
< context:component-scan >


上面的配置將隱式地向Spring容器註冊:CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor以及這4個專門用於處理註解的Bean後置處理器。

AutowiredAnnotationBeanPostProcessor

是spring容器專門處理配置了自動依賴注入裝配相關注解的Bean後置處理器。

(1)建構函式

public AutowiredAnnotationBeanPostProcessor() {  
        //後置處理器將處理@Autowire註解  
        this.autowiredAnnotationTypes.add(Autowired.class);  
        //後置處理器將處理@Value註解  
        this.autowiredAnnotationTypes.add(Value.class);  
        //獲取當前類的類載入器  
        ClassLoader cl = AutowiredAnnotationBeanPostProcessor.class.getClassLoader();  
        try {  
            //後置處理器將處理javax.inject.Inject JSR-330註解  
            this.autowiredAnnotationTypes.add((Class<? extends Annotation>) cl.loadClass("javax.inject.Inject"));  
            logger.info("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");  
        }  
        catch (ClassNotFoundException ex) {  
            // JSR-330 API not available - simply skip.  
        }  
    } 

(2)指定類選擇合適的構造方法

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

容器對指定類進行自動依賴注入裝配時,容器需要對Bean呼叫合適的構造方法建立例項物件,AutowiredAnnotationBeanPostProcessor為指定類選擇相應的構造方法。

(3)對屬性的依賴注入

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

(4)對欄位進行注入

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

(5)對方法進行注入

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

CommonAnnotationBeanPostProcessor

是對JavaEE中常用註解的處理,可以處理@PostConstruct、@PreDestroy等,處理最核心的是@Resource註解。

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 
//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 
//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 
//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 
//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 
//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

RequiredAnnotationBeanPostProcessor

處理@Required註解,@Required註解強制要求Bean屬性必須被配置,當Spring容器對Bean屬性進行依賴注入時,配置了@Required註解的屬性,Spring容器會檢查依賴關係是否設定。

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this.candidateConstructorsCache) {  
                candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
                if (candidateConstructors == null) {  
                    //通過JDK反射機制,獲取指定類的中所有宣告的構造方法  
                    Constructor[] rawCandidates = beanClass.getDeclaredConstructors();  
                    //存放候選構造方法的集合  
                    List<Constructor> candidates = new ArrayList<Constructor>(rawCandidates.length);  
                    //autowire註解中required屬性指定的構造方法  
                    Constructor requiredConstructor = null;  
                    //預設的構造方法  
                    Constructor defaultConstructor = null;  
                    //遍歷所有的構造方法,檢查是否添加了autowire註解,以及是否  
//指定了required屬性  
                    for (Constructor<?> candidate : rawCandidates) {  
                        //獲取指定類中所有關於autowire的註解(Annotation)  
                        Annotation annotation = findAutowiredAnnotation(candidate);  
                        //如果指定類中有關於antowire的註解  
                        if (annotation != null) {  
                            //如果antowire註解中指定了required屬性  
                            if (requiredConstructor != null) {  
                                throw new BeanCreationException("Invalid autowire-marked constructor: " + candidate +  
                                        ". Found another constructor with 'required' Autowired annotation: " +  
                                        requiredConstructor);  
                            }  
                            //如果autowire註解的引數列表為空  
                            if (candidate.getParameterTypes().length == 0) {  
                                throw new IllegalStateException(  
                                        "Autowired annotation requires at least one argument: " + candidate);  
                            }  
                            //獲取autowire註解中required屬性值  
                            boolean required = determineRequiredStatus(annotation);  
                            //如果獲取到autowire註解中required的屬性值  
                            if (required) {  
                                //如果候選構造方法集合不為空  
                                if (!candidates.isEmpty()) {  
                                    throw new BeanCreationException(  
                                            "Invalid autowire-marked constructors: " + candidates +  
                                            ". Found another constructor with 'required' Autowired annotation: " +  
                                            requiredConstructor);  
                                }  
                            //當前的構造方法就是required屬性所配置的構造方法  
                                requiredConstructor = candidate;  
                            }  
                            //將當前的構造方法新增到哦啊候選構造方法集合中  
                            candidates.add(candidate);  
                        }  
                       //如果類中沒有autowire的相關注解,並且構造方法引數列表為空  
                        else if (candidate.getParameterTypes().length == 0) {  
                            //當前的構造方法是預設構造方法  
                            defaultConstructor = candidate;  
                        }  
                    }  
                    //如果候選構造方法集合不為空  
                    if (!candidates.isEmpty()) {  
                    //如果所有的構造方法都沒有配置required屬性,且有預設構造方法  
                        if (requiredConstructor == null && defaultConstructor != null) {  
                            //將預設構造方法新增到候選構造方法列表  
                            candidates.add(defaultConstructor);  
                        }  
                        //將候選構造方法集合轉換為陣列  
                        candidateConstructors = candidates.toArray(new Constructor[candidates.size()]);  
                    }  
                    //如果候選構造方法集合為空,則建立一個空的陣列  
                    else {  
                        candidateConstructors = new Constructor[0];  
                    }  
                    //將類的候選構造方法集合存放到容器的快取中  
                    this.candidateConstructorsCache.put(beanClass, candidateConstructors);  
                }  
            }  
        }  
        //返回指定類的候選構造方法陣列,如果沒有返回null  
        return (candidateConstructors.length > 0 ? candidateConstructors : null);  
    } 

PersistenceAnnotationBeanPostProcessor

用於處理JPA相關注解的Bean後置處理器,主要解析和處理@PersistenceUnit @PersistenceContext註解,其主要作用是為JPA的實體管理器工廠和實體管理器注入相應的持久化單元或上下文。

//為自動依賴注入裝配Bean選擇合適的構造方法  
public Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException {  
        //首先從容器的快取中查詢是否有指定Bean的構造方法  
        Constructor[] candidateConstructors = this.candidateConstructorsCache.get(beanClass);  
        //容器快取中沒有給定類的構造方法  
        if (candidateConstructors == null) {  
            //執行緒同步以確保容器中資料一致性  
            synchronized (this