봄의 주석은 대략 두 가지 범주로 나눌 수 있습니다.
1) 스프링 콩 용기 또는 콩 공장과 관련된 주석;
2) SpringMVC와 관련된 주석.
Spring 's Bean 컨테이너와 관련된 주석에는 @required, @autowired, @postconstruct, @predestory 및 jsr-330 표준 javax.inject의 주석이 포함됩니다.
SpringMVC 관련 주석은 다음과 같습니다. @Controller, @RequestMapping, @RequestParam, @ResponseBody 등
봄의 주석을 이해하려면 먼저 Java의 주석을 이해해야합니다.
1. Java의 주석
Java 1.5에서 주석이 도입되기 시작했습니다. 우리가 가장 친숙한 것은 다음과 같이 정의 된 @override입니다.
/** * 메소드 선언은 슈퍼 타입에서 * 메소드 선언을 무시하기위한 것임을 나타냅니다. 메소드가 *로 주석이 달린 경우 *이 주석 유형 컴파일러는 다음 조건 중 하나 이상이 유지되지 않는 한 오류 * 메시지를 생성하기 위해 필요합니다. *이 메소드에는 객체에 선언 된 모든 공개 메소드와 상당한 서명이 있습니다. * * @Author Peter von der Ahé * @Author Joshua Bloch * @Jls 9.6.1.4 @Override * @Since 1.5 */ @target (eleMentType.Method) @retention (rendentionPolicy.source) 공개 @Interface}
주석에서 @override의 기능은 @override 주석에 사용 된 방법이 Java.lang.object에서 동일한 이름의 메소드를 무시해야한다는 컴파일러를 프롬프트하는 것임을 알 수 있습니다. 우리는 @target과 @retention이 @override의 정의에 사용된다는 것을 알 수 있습니다. 그것들은 소위 "메타 공장"입니다. 주석을 정의하는 주석 또는 주석 (현기증)을 정의하는 주석입니다. @retention을 살펴 보겠습니다
/** * 주석이 달린 유형의 주석이 얼마나 오래 유지 될지를 나타냅니다. 주석 유형 선언에 보존 주석이없는 경우, 유지 정책은 * rendentpolicy.class로 기본적으로 기본적으로 표시됩니다. * /@documented@retention (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface restention { /*** 보존 정책을 반환합니다. * @유지 정책 */ retentionpolicy value ();}@retention은 주석이 얼마나 오래 유지되는지 프롬프트하는 데 사용됩니다. 세 가지 값이 있습니다.
공개 ENUM REGENTIONPOLICY { /*** 주석은 컴파일러에 의해 공개됩니다. * / source, / ** * 주석은 컴파일러가 클래스 파일에 기록되어야하지만 런타임에 VM에 의해 유지 될 필요는 없습니다. 이것이 기본 * 동작입니다. * / class, / ** * 주석은 컴파일러에 의해 클래스 파일에 기록되고 * 런타임에 VM에 의해 유지되므로 반사적으로 읽을 수 있습니다. * * @ @see java.lang.reflect.annotatedElement */ runtime} rendentionpolicy.source는 소스 코드 수준에서 유지되고 컴파일러에 의해 포기됩니다 (@override는 이런 종류). rendentionpolicy.class는 컴파일러에 의해 컴파일 된 클래스 파일 레벨에서 유지되지만 가상 시스템에 의해 폐기됩니다.
rendentpolicy.runtime은 런타임까지 예약되어 있으며 반사로 읽을 수 있습니다.
@TARGET를보십시오 :
패키지 java.lang.annotation;/*** 주석 유형이 적용되는 컨텍스트를 나타냅니다. 주석 유형이 적용 가능한 * 선언 컨텍스트 및 유형 컨텍스트는 jls 9.6.4.1에 지정되고 java.lang.annotation.elementtype * @since 1.5 * @JLS 9.6.4.1 @TARGET * @JLS 9.4에 따라 소스 코드에 표시됩니다. */@documented@retention (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface target {/** * 주석 유형 *에 적용 할 수있는 요소의 종류를 반환합니다. * @return 주석 유형 *에 */elementType [] value ();}에 적용될 수 있습니다.@target 은이 주석의 사용을 자극하는 데 사용되며 값은 다음과 같습니다.
public enum elementType { /** 클래스, 인터페이스 (주석 유형 포함) 또는 열거 선언* /유형, /** 필드 선언 (Enum 상수 포함)* /필드, /** 메소드 선언* /메소드, /** 정식 매개 변수 선언* /매개 변수, /** local _variable toletation* /local_variable, /*allariable plublaration* /parameter, /** 구성 요소 선언 */ annotation_type,/ ** 패키지 선언 */ package,/ ** * 유형 매개 변수 선언 * @ince 1.8 */ type_parameter,/ ** * 유형 사용 * @sceince 1.8 */ type_use}이 주석이 별도로 사용할 수있는 위치를 나타냅니다. 1) 클래스, 인터페이스, 주석, 열거; 2) 속성 도메인; 3) 방법; 4) 매개 변수; 5) 생성자; 6) 로컬 변수; 7) 주석 유형; 8) 패키지
그래서:
@TARGET (ElementType.Method) @retention (rendentionpolicy.source) public @interface atredid {}이는 @override가 메소드에서만 사용하고 소스 코드 레벨에서 유지하고 컴파일러에 의해 처리 된 다음 폐기 할 수 있음을 의미합니다.
자주 사용되는 메타 주석 @documented도 있습니다.
/** * 유형이있는 주석은 기본적으로 javadoc * 및 유사한 도구에 의해 문서화되어야 함을 나타냅니다. 이 유형은 주석이 고객이 주석이 달린 * 요소의 사용에 영향을 미치는 유형의 * 선언에 주석을 달아야합니다. 유형 선언이 * 문서화 된 상태로 주석이 달린 경우 해당 주석은 주석이 달린 요소의 공개 API *의 일부가됩니다. */@documented@retention (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface 문서화 된 {}주석이 Javadoc에 의해 처리 될 수 있는지 여부를 나타냅니다.
2. 메타 주석으로 사용자 정의 주석을 사용자 정의하고 처리합니다
메타 주석을 사용하면 필요한 주석을 사용자 정의 할 수 있습니다. 맞춤형 주석과 AOP 또는 필터를 결합하는 것은 매우 강력한 무기입니다. 예를 들어, 주석을 사용하여 권한의 세밀한 제어를 달성하는 데 사용될 수 있습니다. 클래스 나 방법에 대한 권한 주석을 사용한 다음 AOP 또는 필터에서 가로 채 웁니다. 로그인 권한에 대한 주석 구현은 다음과 같습니다.
/*** 로그인 주석 없음*/@target ({elementType.Method, ElementType.type})@resentente(Repolicy.runtime)@documentedPublic @interface nologin {}우리는 방법과 클래스에 사용할 수있는 맞춤형 주석 @Nologin을 가지고 있습니다. 주석은 런타임까지 유지되며 반사로 읽을 수 있습니다. 이 주석의 의미는 다음과 같습니다. 사용자가 로그인하지 않더라도 @Nologin에 의해 주석이 달린 클래스 또는 메소드에 액세스 할 수 있습니다. 다음은 주석의 과정입니다.
/*** 로그인 인터셉터 확인* 로그인을 확인할 필요가 없다면 메소드 또는 컨트롤러에 @Nologin을 추가 할 수 있습니다*/public class checklogininterceptor and handlerinterceptor {private static final logger = logger.getLogger (checkloginichercepor.class); @reatide public prehandle (httservletreponse, htpserverever request, htpserverever request) handler)는 예외를 {! (! handlermethod.getMethod (). getName (); // 로그인 NOLOGIN = HandlerMETHOD.getMethod (). getAnnotation (nologin.class); if (null! = nologin) {if (logger.isdebugenabled ())) {logger.debug ( "현재 작업 메소드 이름 =" + methodName + "login을 확인할 필요 없음");} nologin = handlermethod.getMethod (). if (null! = nologin) {if (logger.isdebugenabled ())) {logger.debug ( "현재 작업 메소드 이름 =" + methodName = " + methodName +"login을 확인할 필요가 없음 ");} true;} if (null == request.getSection (commonConstants. "사용자가 로그인하지 않음, ip =" + request.getRemoteaddr ()); response.getWriter (). 쓰기 (jsonConvertor.convertFailResult (jsonConvertor.convertFailResult (erverCodeEnum.not_login) .ToString ()); // return return true;}@retured provoid (httpservletrecet, httpserquest request) 핸들러, ModelAndView ModelView)는 예외 {} @Override public void afthCompletion (httpservletRequest 요청, httpservletResponse 응답, 객체 핸들러, 예외)을 던지기 예외 {}}를 던집니다.위의 위에서 우리는 먼저 반사를 사용하여 @nologin에 의해 메소드에 주석이 달린지 여부를 결정하는 로그인 인터셉터를 정의합니다.
Nologin nologin = handlermethod.getMethod (). getAnnotation (nologin.class);
그런 다음 @nologin에 의해 수업에 주석을 달고 있는지 확인하십시오.
nologin = handlermethod.getMethod (). getDeclaringClass (). getAnnotation (nologin.class);
주석이 달라지면 true가 반환됩니다. 주석이 주석이없는 경우 로그인되었는지 여부가 결정됩니다. 로그인하지 않으면 오류 메시지를 전경 및 False에 반환합니다. 이것은 권한 처리를 위해 주석 및 필터를 사용하는 간단한 예입니다. 확장되면 주석을 사용하여 특정 방법이나 클래스에 특정 역할이나 권한을 가진 사용자 만 액세스 한 다음 필터에서 판단 할 수 있습니다.
3. 스프링 콩 용기와 관련된 주석
1) @autowired는 우리가 가장 많이 사용하는 주석입니다. 실제로, Autowire = Bytype는 도메인, 방법 및 생성자에 사용할 수있는 유형 (주석 기반 종속성 주입)을 기반으로 자동 주입 종속성입니다.
2) @qualifier는 Autowire = byname입니다. @autowired 주석이 여러 콩 유형이 동일하다고 판단하면 종속 Bean의 ID를 지정하기 위해 @Qualifier ( "XXBean")를 사용해야합니다.
@controller @requestMapping ( "/user") 공개 클래스 hellocontroller {@autowired @qualifier ( "userservice") private userervice userervice;3) @Resource는 JSR250 표준에 속하며 도메인 및 방법에 사용됩니다. 또한 ByName 유형의 종속성 주입입니다. 사용법 방법 : @Resource (이름 = "xxbean"). @Resource 매개 변수가없는 기본값 클래스 이름에는 소문자가 있습니다.
4) JSR-330 표준 javax.inject.* (@inject, @named, @qualifier, @provider, @scope, @singleton)의 주석. @Inject는 @autowired와 동일하며 @Named는 @Qualifier와 동일하며 @Named는 클래스에서 @Component로도 사용됩니다.
5) @Component, @Controller, @Service, @Repository, 이러한 주석은 위의 주석과 다릅니다. 위의 주석은 의존 콩에 주입되며 이러한 주석의 기능은 콩을 생산하는 것입니다. 이 주석은 수업에 주석이 달리며, 스프링 콩 공장에서 클래스를 콩에 하나씩 주석을 달 수 있습니다. @Controller, @Service, @Repository는 기본적으로 더 세련된 의미를 가진 @Component입니다.
6) @postconstruct 및 @predestroy는 종속성 주입이 아니라 콩의 수명주기에 사용됩니다. Init-Method (초기화 비)와 유사합니다.
4. 봄에 주석 처리
스프링의 주석 처리는 기본적으로 인터페이스 BeanPostProcessor를 구현하여 수행됩니다.
공개 인터페이스 BeanPostProcessor {Object PostProcessBeforeInitialization (Object Bean, String Beanname)은 Beansexception을 던졌습니다. Object postprocessafterinitialization (객체 Bean, String Beanname)은 Beansexception을 던졌습니다.}관련 처리 클래스는 다음과 같습니다. AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor, EquiredAntAntationBeanPostProcessor
이러한 처리 클래스는 <Context : Annotation-Config/>를 통해 스프링 컨테이너로 암시 적으로 구성 될 수 있습니다. 이들은 모두 의존성 주입의 처리뿐만 아니라 생산 Bean 주석 처리 (@component, @controller, @service, @repository)의 처리입니다.
<Context : Component-Scan Base-Package = "net.aazj.service, net.aazj.aop" />
스캔 한 기본 패킷 경로를 지정하여 스프링 콩 용기로 스캔하여 수행됩니다. 컨텍스트 : Component-Scan은 기본적으로 AutowiredAnnotationBeanPostProcessor 및 CommonAnnotationBeanPostProcessor를 구성합니다. 따라서 <context : Annotation-config/>를 생략 할 수 있습니다. 또한 Context : Component-Scan은 @aspect 스타일 AOP 주석을 스캔 할 수도 있지만 <AOP : SASPINGJ-AUTOPROXY/>를 구성을 위해 구성 파일에 추가해야합니다.
5. 스프링 주석과 JSR-330 표준 주석의 차이 :
요약
위의 것은 봄의 다양한 주석을 빠르게 이해하는 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!