springboot 자동 설정 에 적용 되 지 않 은 문제 위치(조건 정지점)

Spring Boot 는 개발 자 에 게 더욱 높 은 차원 의 패 키 징 을 제공 하여 개발 효율 을 높이 는 동시에 문제 가 발생 했 을 때 포 지 셔 닝 을 어떻게 하 는 지 에 어느 정도 복잡성 과 어려움 을 가 져 왔 다.그러나 Spring Boot 는 spring-boot-starter-actuator 와 같은 진단 도 구 를 제공 하여 개발 과 분석 을 보조 했다.본 고 는 actuator 와 IDEA 조건 단점 을 바탕 으로 자동 설정 이 적용 되 지 않 은 사례 를 공유 합 니 다.유사 한 문제 에 대한 분석 과 처리 에 참고 가 되 기 를 바 랍 니 다.
문제 확인
앞에서 소개 한 Spring Boot 는 입문 부터 실전 까지:유 니 버 설 Mapper 를 통합 하여 단일 표 작업 을 간소화 하 는 과정 에서 저 희 는 druid 연결 탱크 에 자동 으로 설정 하고 druid 의 모니터링 통계 기능 을 주입 하 였 습 니 다.다음 과 같 습 니 다.

로 컬 실행 후 통과http://localhost:8080/druid/index.html접근 하 는 중 오류 가 발생 했 습 니 다.브 라 우 저의 개발 자 도 구 를 통 해 이 요청 을 404 로 되 돌려 주 십시오.상기 코드 에 정 의 된 StatViewServlet 이 주입 되 지 않 았 을 것 으로 추 정 됩 니 다.우 리 는 actuator 로 이렇게 되 었 는 지 확인 합 니 다.프로젝트 에 spring-boot-starter-actuator 를 추가 하고 application.yml 에 다음 설정 을 추가 합 니 다.

management:
endpoints:
web:
exposure:
include: "*"
exclude: beans,trace
endpoint:
health:
show-details: always
spring-boot 2.x 버 전에 서 는 안전성 을 고려 하여 actuator 컨트롤 의 포트 를 기본 으로/health 와/info 두 포트 만 열 고 다른 포트 는 기본 으로 닫 기 때문에 위 설정 을 추가 해 야 합 니 다.include 의 값*에 따 옴 표를 붙 여야 합 니 다.그렇지 않 으 면 시작 할 수 없습니다.
프로그램 다시 시작 후 접근http://localhost:8080/actuator/conditions상기 두 가지 실례 화 방법 이@conditionalOnProperty 의 조건 을 만족 시 키 지 못 하여 효력 이 발생 하지 않 았 음 을 확인 합 니 다.그림 과 같 습 니 다.

조건 부 정지점
위 에서 분석 한 결과 조건 주해@ConditionalOnProperty(prefix="spring.datasource.druid",name="druidServletSettings")가 만족 하지 않 아 방법 이 실행 되 지 않 았 기 때 문 으로 확인 되 었 습 니 다.그럼 이 조건 은 왜 만족 하지 않 습 니까?application.yml 에서 도 spring.datasource.druid.druid ServletSettings 속성 을 설정 하 였 습 니 다.
실 마 리 를 잡 을 수 없 을 때 문제 의 원인 을 확인 할 때 Debug 를 사용 하 세 요.주해@ConditionalOnProperty 소스 코드 를 보고 지원 클래스 OnProperty Condition 을 찾 으 면 다음 과 같 습 니 다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
String[] value() default {};
String prefix() default "";
String[] name() default {};
String havingValue() default "";
boolean matchIfMissing() default false;
}
OnProperty Condition 소스 코드 를 보고 getMatch Outcome 방법 을 통 해 주해 매개 변수 가 지정 한 조건 을 만족 시 키 는 지 여 부 를 판단 합 니 다.다음 과 같 습 니 다.

@Override
public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) {
List<AnnotationAttributes> allAnnotationAttributes = annotationAttributesFromMultiValueMap(
metadata.getAllAnnotationAttributes(
ConditionalOnProperty.class.getName()));
List<ConditionMessage> noMatch = new ArrayList<>();
List<ConditionMessage> match = new ArrayList<>();
for (AnnotationAttributes annotationAttributes : allAnnotationAttributes) {
ConditionOutcome outcome = determineOutcome(annotationAttributes,
context.getEnvironment());
(outcome.isMatch() ? match : noMatch).add(outcome.getConditionMessage());
}
if (!noMatch.isEmpty()) {
return ConditionOutcome.noMatch(ConditionMessage.of(noMatch));
}
return ConditionOutcome.match(ConditionMessage.of(match));
}
determineOutcome 에서 중단 점 을 호출 합 니 다.어떤 원인 으로 인해 조건 이 만족 하지 않 았 는 지 디 버 깅 합 니 다.그러나 여 기 는 for 순환 입 니 다.for 요소 가 너무 많 으 면 단점 을 여러 번 차단 해 야 원 하 는 요 소 를 찾 을 수 있 습 니 다.
다행히 IDEA 는 이러한 문 제 를 처리 하기 위해 다양한 유형의 정지점 을 제공 하 였 으 며,이러한 순환 블록 중의 debug 문 제 를 조건 정지점 으로 처리 하 는 것 을 소개 합 니 다.
상기 코드 for 순환 에서 determineOutcome 줄 의 중단 점 을 호출 하고 정지점 에서 오른쪽 단 추 를 누 르 면 다음 창 이 팝 업 됩 니 다.

그림 에서 Condition 상 자 는 지정 한 조건 을 입력 할 수 있 습 니 다.자바 판단 식 코드 를 직접 쓰 고 이 줄 코드 에 접근 할 수 있 는 변 수 를 참조 할 수 있 습 니 다.예 를 들 어 annotationAttributes.get("name").equals("druid ServletSettings")를 입력 한 다음 Debug 창의"Resume Program(F9)"단 추 를 누 르 면 지정 한 조건 을 만족 시 키 지 못 할 때,단점 은 조건 이 만족 할 때 까지 차단 되 지 않 습 니 다.그러면 우리 가 보고 싶 은 요 소 를 쉽게 찾 을 수 있 습 니 다.(물론 여기 allAnnotationAttributes 변 수 는 하나의 요소 만 있 습 니 다.단지 조건 변수의 사용 을 보 여주 기 위해 서 입 니 다.집합 요소 가 많 을 때 조건 단점 을 사용 하면 편리 함 을 느 낄 수 있 습 니 다)
문제 포 지 셔 닝
Debug 의 방식 을 통 해 조건 주해 의 판단 논리(그 중에서 순환 부 에서 조건 단점 을 사용 할 수 있 음)에 깊이 들 어가 다음 코드 세 션 에 도착 합 니 다.

모든 속성 원 설정 의 속성 에서 조건 설명 이 지정 한 속성 을 포함 하 는 지 판단 하 는 것 입 니 다.즉,spring.datasource.druid.druid ServletSettings 입 니 다.위의 그림 에서 보 듯 이 spring.datasource.druid.druid ServletSettings 는 일부 속성의 접두사 일 뿐 완전히 일치 하 는 속성 이 존재 하지 않 기 때문에 false 로 돌아 가 조건 이 만족 하지 않 습 니 다.주해@Condition OnProperty 의 자바 doc 를 돌아 보 세 요.

* If the property is not contained in the {@link Environment} at all, the
* {@link #matchIfMissing()} attribute is consulted. By default missing attributes do not
* match.
* <p>
* This condition cannot be reliably used for matching collection properties. For example,
* in the following configuration, the condition matches if {@code spring.example.values}
* is present in the {@link Environment} but does not match if
* {@code spring.example.values[0]} is present.
*
Environment 에 이 속성 이 포함 되 어 있 지 않 을 때 matchIfMissing 의 값 을 봅 니 다.이 값 은 기본적으로 false 입 니 다.이 속성 을 포함 하면 속성 값 과 havingValue 의 값 을 비교 합 니 다.같 으 면 만족 하고 같 지 않 으 면 만족 하지 않 습 니 다.또한 이 조건 주 해 는 집합 유형 속성 과 일치 하 는 데 사용 할 수 없습니다.상기 spring.datasource.druid.druid ServletSettings 는 실제 맵 형식 에 속 하기 때문에 이 주 해 는 속성 이 특정한 속성 이름 에 집중 되 어 이 값 을 포함 하면 만족 하 는 것 이 라 고 생각 할 수 없습니다.
총결산
문제 의 원인 을 찾기 어 려 울 때 Debug,추적 프로그램 이 실행 되 는 각 절 차 를 진행 할 수 있 습 니 다.순환 중 Debug 가 특정한 요 소 를 찾 으 려 면 조건 단점 으로 이 루어 질 수 있 습 니 다.@Condition alOnProperty 주 해 는 특정한 속성 만 존재 하 는 것 이 아니 라 값 이 같 아야 하 며 집합 유형 속성 에 적용 되 지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기