1. Java Custom Annotations and Spring
프로그램 요소 (클래스, 멤버 변수, 멤버 메소드 등)의 일종의 메타 데이터 정보로서 Java 주석은 프로그램 자체의 실행에 영향을 미치지 않습니다. 사용자 정의 주석을 통해 프로그램 요소에 특별 선언을 추가 할 수 있습니다.
Spring은 엔터프라이즈 수준의 응용 프로그램을 구축하기위한 플랫폼으로서 풍부한 기능을 제공합니다. 특정 시나리오에서 Java의 맞춤형 주석을 Spring과 결합하여 특정 시나리오에서 주석의 구문 분석 및 처리를 구현하면 응용 프로그램의 결합 정도를 줄이고 프로그램의 확장 성을 향상시킬 수 있습니다.
2. 응용 프로그램 시나리오
다음은 여러 응용 프로그램 시나리오를 요약하고 일반적인 아이디어 만 설명합니다 (PS : 프로젝트에서 모든 시나리오가 실시 된 것은 아닙니다)
2.1 로그인, 권한 차단
웹 프로젝트에서 로그인 차단 및 권한 차단은 진부한 기능입니다. 사용자 정의 로그인 주석 또는 권한 주석을 통해 사용자 정의 인터셉터의 말을 구문 분석하여 로그인 및 권한 차단 기능을 실현합니다.
이 사용 방법에는 간단한 구성, 유연성이 높고 코드 커플 링이 적습니다.
2.2 타이밍 작업 관리
시스템 구성 프로세스 중에 다양한 시간이 지정된 작업 요구 사항이 있으며, 시간이 정해진 작업의 중앙 집중식 관리는 시스템 운영을보다 효율적으로 유지할 수 있습니다.
공식 Java 주석 문서의 Retering -annotations 장의 사용자 정의 타이밍 작업 주석은 비즈니스 방법의 타이밍 작업 선언을 실현할 수 있습니다. Spring 's Container PostProcessor BeanPostProcessor (PS : Spring Container PostProcessor는 다음 기사에서 논의 될 예정), 맞춤형 주석을 구문 분석합니다. 그런 다음 구문 분석 된 주석 정보는 Quartzapi를 사용하여 런타임 타이밍 작업을 구축하는 데 사용되며, 이는 타이밍 작업의 런타임 생성 및 중앙 집중식 관리를 완료 할 수 있습니다.
이 방법은 석영 타이밍 작업의 구성을 정의하지 않고 시스템 확장 성을 향상시킬 수 있습니다.
2.3 다중 데이터 소스 라우팅을위한 데이터 소스 사양
Spring에서 제공하는 AbstractroutingDatasource는 여러 데이터 소스의 동적 라우팅을 구현하며 마스터 슬레이브 분리 아키텍처에서 적용 할 수 있습니다. 다른 방법에 대해 다른 데이터 소스를 지정하면 데이터 소스의 동적 라우팅이 실현됩니다 (예 : 읽기 메소드는 슬레이브 데이터베이스 데이터 소스에서 이동하고 기본 데이터베이스 데이터 소스에서 쓰기 메소드가 이동합니다). 다른 방법에 해당하는 데이터 소스 유형을 식별하는 방법 사용자 정의 주석을 사용하여 구현할 수 있습니다. 데이터 소스의 라우팅 기능은 메소드에 선언 된 해당 데이터 소스 유형을 분석하여 실현됩니다.
이 메소드는 메소드의 패턴 매개 구문 분석 (예 : Select부터 시작, 업데이트로 시작하는 등)을 피하며 선언은 더 유연합니다.
맞춤형 주석
가장 간단한 예를 살펴 보겠습니다. SpringWeb 응용 프로그램을 사용하는 과정에서 필연적으로 @Controller, @Service, @Repository 및 기타 주석을 사용하여 Javabeans를 정의합니다. 그렇다면 어떻게 주석을 직접 정의 할 수 있습니까? 스프링은 자동으로로드 될 수 있습니다. 따라서 첫 번째 예가 있습니다.
@TARGET ({ElementType.type})@retention (retentionpolicy.runtime)@documented@componentpublic @interface myComponent {String value () default ";} @ConfigurationPublic 클래스 componentAntOntationTest {public static void main (string [] args) {AnnotationConfigApticationContext AnnotationConfigApplicationContext = new AnnotationConfigApplicationContext (); AnnotationConfigApplicationContext.register (componentAntationTest.register); AnnotationConfigApplicationContext.Refresh (); InjectClass InjectClass = AnnotationConfigApplicationContext.getBean (injectClass.class); InjectClass.print (); } @MyComponent public static class injectclass {public void print () {System.out.println ( "Hello World"); }}}이 예제를 실행하면 @MyComponent에 의해 주석이 달린 클래스도 Spring에 의해로드되어 일반 Javabean으로 정상적으로 사용할 수 있음을 알 수 있습니다. Spring의 소스 코드를 확인하면 Spring이 ClassPathScanningCandaTeComponentProvider를 사용하여 패키지를 스캔하는 것을 알 수 있습니다. 이 수업에는 그러한 주석이 있습니다.
기본 패키지에서 클래스 경로를 스캔하는 구성 요소 제공자. 그런 다음 후보자를 찾기 위해 제외 및 필터를 결과 클래스에 포함시킵니다.
이 클래스의 RegisterDefaultFilters 메소드에는 여러 줄의 코드가 있습니다.
보호 된 void registerDefaultFilters () {this.includeFilters.add (new AnnotationTyPefilter (component.class)); ClassLoader CL = ClassPathScanningCandIdAteComponentProvider.class.getClassLoader (); try {this.includefilters.add (new AnnotationTypefilter ((((((() <? <? <? elspends annottends annottends>))) classutils.forname ( "javax.annotation.managedbean", cl)), false); logger.debug ( "JSR-250 'javax.annotation.managedBean'이 구성 요소 스캔을 위해 발견되고 지원됩니다"); } catch (classNotFoundException ex) {// jsr -250 1.1 API (Java EE 6에 포함)를 사용할 수 없습니다. } try {this.includefilters.add (new annotationtyPefilter ((((((() <salless annottends ", <class <? eleject>)) elject.name", cl))))); logger.debug ( "JSR-330 'javax.inject.named'구성 요소 스캔을 위해 찾아서 지원 된 주석"); } catch (classNotFoundException ex) {// jsr -330 API를 사용할 수 없음 - 간단히 건너 뜁니다. }}여기서 Spring의 스캔 클래스 정보 사용은 @Component가 주석을 달린 클래스를 판단 할 것이므로 @Component가 장착되어있는 한 스프링으로 스캔하고 컨테이너에 주입 할 수 있습니다 (물론 String value () 기본값 ""; 방법, Spring 's Bean은 BEAMNAME에 독특하게 표시되기 때문에).
요약
위의 내용은 봄에 맞춤형 주석의 적용에 대한이 기사의 간단한 토론에 관한 모든 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!