Spring 의 autowire-candidate 디자인 을 자세히 설명 합 니 다.

Xml 프로필 의 default-autowire-candidates 속성
어떤 학생 들 은 이 설정 에 대해 익숙 하지 않 거나 이 설정 의 존 재 를 모른다 고 말 할 수 있 습 니 다.우선 default-autowire-candidates 이 설정 이 어디 에 있 는 지 살 펴 보 겠 습 니 다.

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
         default-autowire-candidates="service*">

    <bean id="serviceA" class="org.wonder.frame.xmlConfig.SetterBean$ServiceA" autowire-candidate="false"/>
    <bean id="serviceB" class="org.wonder.frame.xmlConfig.SetterBean$ServiceB"  />
    <bean id="setterBean" class="org.wonder.frame.xmlConfig.SetterBean" autowire="byType" />
</beans>
아이디어 에서 default-autowire-candidates 라 는 속성 이 있 는 spring-beans.xsd 를 누 르 면 이 속성 에 대한 공식 설명 을 볼 수 있 습 니 다.
A default bean name pattern for identifying autowire candidates: e.g. "Service", "data", "Service", "dataService". Also accepts a comma-separated list of patterns: e.g. "Service,*Dao". See the documentation for the 'autowire-candidate' attribute of the 'bean' element for the semantic details of autowire candidate beans.
간단하게 번역 하면 이 속성 은 설정 파일 에 있 는 모든 Bean 이 기본적으로 자동 으로 후보자 의 이름 을 입력 하 는 일치 모드 가 될 수 있 는 지 를 표시 할 수 있 습 니 다.예 를 들 어"Service","data","Service","dataService"등 입 니 다.쉼표 로 구 분 된 문자열 모드 목록 도 지원 합 니 다."Service,Dao".예 를 들 어 위 설정 파일 에 설 정 된 service\는 serviceA 와 일치 합 니 다.serviceB 두 개의 Bean.그러나 Spring 의 디자인 규정 에 따 르 면 serviceA 자체 설정 의 autowire-candidate 는 false 로 default-autowire-candidates 설정 을 덮어 쓰기 때문에 serviceA 는 자동 으로 주입 되 는 후보자 가 되 지 않 습 니 다.
정합 논리 알고리즘
우 리 는 소스 코드 에 깊이 들 어가 서 Spring 이 어떻게 이 일치 모델 에 따라 자신의 bean 이름과 일치 하 는 지 보 았 다.

String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
if ("".equals(autowireCandidate) || DEFAULT_VALUE.equals(autowireCandidate)) {
   String candidatePattern = this.defaults.getAutowireCandidates();
   if (candidatePattern != null) {
      String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
      bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
   }
}
else {
   bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
}
분명 한 것 은 bean 자체 가 autowire-candidate 를 비어 있 거나 기본 값 으로 설정 한 상황 에서 Spring 은 default-autowire-candidates 문자열 을 배열 로 변환 한 다음 PatternMatch Utils 류 의 simpleMatch 방법 에 의존 하여 현재 bean 의 이름 이 일치 하 는 지 검증 합 니 다.성공 여 부 는 현재 bean 의 autowire Candidate 속성 에 값 을 부여 합 니 다.사실 가장 중요 한 것 은 PatternMatchUtils.simpleMatch 방법 입 니 다.
PatternMatchUtils.simpleMatch

public static boolean simpleMatch(@Nullable String pattern, @Nullable String str) {
   //pattern                     false
   if (pattern == null || str == null) {
      return false;
   }
   //     *              
   int firstIndex = pattern.indexOf('*');
   if (firstIndex == -1) {
      //                           。
      return pattern.equals(str);
   }
   //*    
   if (firstIndex == 0) {
      //*                1       true ,   *
      if (pattern.length() == 1) {
         return true;
      }
      //     *     
      int nextIndex = pattern.indexOf('*', firstIndex + 1);
      if (nextIndex == -1) {
         //    * ,               pattern   。
         //  *service   Aservice       
         return str.endsWith(pattern.substring(1));
      }
      //     *      *       
      String part = pattern.substring(1, nextIndex);
      if (part.isEmpty()) {
         return simpleMatch(pattern.substring(nextIndex), str);
      }
      //str         
      int partIndex = str.indexOf(part);
      while (partIndex != -1) {
         if (simpleMatch(pattern.substring(nextIndex), str.substring(partIndex + part.length()))) {
            return true;
         }
         // partIndex+1     part   
         partIndex = str.indexOf(part, partIndex + 1);
      }
      return false;
   }
   //              *             
   //        0      *        ,          0      *          
   //     ,              *                      *            
   return (str.length() >= firstIndex &&
         pattern.substring(0, firstIndex).equals(str.substring(0, firstIndex)) &&
         simpleMatch(pattern.substring(firstIndex), str.substring(firstIndex)));
}
이 Utils 류 의 도구 함수 에서 실 현 된 문자열 모호 일치 알고리즘 은 우리 가 일상적인 개발 에서 문자열 의 조작 에 도 다소 도움 이 될 것 입 니 다.
총결산
Spring 의 많은 디자인 디 테 일 은 항상 우리 에 게 많은 놀 라 움 을 주 었 고 그 중에서 우 리 는 작은 기 교 를 많이 할 수 있어 서 우리 의 일상적인 개발 에 많은 깨 우 침 을 줄 수 있다.
이상 은 Spring 의 autowire-candidate 디자인 에 대한 상세 한 내용 입 니 다.Spring 의 autowire-candidate 디자인 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기