spring註解原始碼分析-解析和注入註解配置的資源
阿新 • • 發佈:2019-01-31
類內部的註解,如@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