Anmerkungen im Frühling können grob in zwei Kategorien unterteilt werden:
1) Anmerkungen zu Frühlingsbohnenbehältern oder Bohnenfabriken;
2) Anmerkungen im Zusammenhang mit SpringMVC.
Zu den Anmerkungen im Zusammenhang mit dem Bean-Container von Spring gehören: @Required, @autowired, @Postconstruct, @Predestory und die Anmerkungen im JSR-330 Standard Javax.inject.
Zu den Anmerkungen zu den zugehörigen SpringMVC gehören: @Controller, @RequestMapping, @RequestParam, @ResponseBody usw.
Um die Anmerkungen im Frühjahr zu verstehen, müssen Sie zunächst die Anmerkungen in Java verstehen.
1. Anmerkungen in Java
Anmerkungen wurden in Java 1.5 eingeführt. Der, mit dem wir am besten vertraut sind, sollte: @Override, was wie folgt definiert ist:
/** * zeigt an, dass eine Methodenerklärung eine * -Methode -Deklaration in einem Supertyp überschreiben soll. Wenn eine Methode mit * mit * kommentiert wird, sind diese Annotationstyp -Compiler erforderlich, um eine Fehler * -Meldung zu generieren, es sei denn, mindestens eine der folgenden Bedingungen ist: * Die Methode überschreibt oder implementiert eine in einem * SuperType deklarierte Methode. * Die Methode hat eine Signatur, die zu der von einer öffentlichen Methode überschrieben wird. * * @Author Peter von der Ahé * @author joshua bloch * @jls 9.6.1.4 @Override * @Since 1.5 */ @target (elementtype.method) @Retention (retentionPolicy.source) public @Interface Override {} überschritten {}Aus der Annotation können wir feststellen, dass die Funktion von @Override darin besteht, den Compiler zu fordern, dass die von @Override Annotation verwendete Methode die übergeordnete Klasse oder eine gleichnamige Methode in java.lang.object überschreiben muss. Wir sehen, dass @Target und @Retention in der Definition von @Override verwendet werden. Sie sind die sogenannten "Meta-Annotationen"-sie sind die Anmerkungen, die die Anmerkungen oder die Anmerkungen definieren, die Annotationen (schwindelig ...). Schauen wir uns @Retention an
/** * Gibt an, wie lange Anmerkungen mit dem kommentierten Typ erhalten bleiben sollen. Wenn keine Annotation bei der Aufbewahrung von * einer Annotationstypdeklaration vorhanden ist, ist die Aufbewahrungsrichtlinie auf * retentionPolicy.class ausgestattet. * /@Documented@retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface -Retention { /*** Gibt die Aufbewahrungsrichtlinie zurück. * @return die Aufbewahrungsrichtlinie */ retentionPolicy value ();}@-Retention wird verwendet, um zu fordern, wie lange die Annotation beibehalten wird. Es gibt drei Werte:
öffentliche Enum -RetentionPolicy { /*** Anmerkungen sind vom Compiler offenbart. * / Quelle, / ** * Anmerkungen sind in der Klassendatei vom Compiler * aufgezeichnet, müssen jedoch zur Laufzeit nicht von der VM beibehalten werden. Dies ist das Standardverhalten. * / Class, / ** * Anmerkungen sind vom Compiler in der Klassendatei aufgezeichnet und * von der VM zur Laufzeit aufbewahrt, sodass sie reflektierend gelesen werden können. * * @see java.lang.reflect.annotatedElement */ runTime} RetentionPolicy.Source wird auf der Ebene der Quellcode aufbewahrt und vom Compiler aufgegeben (@Override ist diese Art); RetentionPolicy.Class wird vom Compiler auf der Dateiebene zusammengestellt, aber von der virtuellen Maschine verworfen.
RetentionPolicy.Runtime ist bis zur Laufzeit reserviert und kann durch Reflexion gelesen werden.
Schauen Sie sich @Target an:
Paket java.lang.annotation;/*** Zeigt die Kontexte an, in denen ein Annotationstyp anwendbar ist. Die * Deklarationskontexte und Type Kontexte, in denen ein Annotationstyp * anwendbar sein kann, sind in JLS 9.6.4.1 angegeben und in Quellcode von Enum * Constants von Java.lang.Annotation.Elementtype * @Since 1.5 * @jls 9.6.4.1 @target * @jls 9.7.7.4.4, wobei die Anotionen scheinen, scheinen zu scheinen zu scheinen zu sehen. */@Documented@retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface Target {/** * Gibt ein Array der Art von Elementen zurück, auf die ein Annotationstyp * angewendet werden kann. * @return ein Array der Art von Elementen Ein Annotationstyp * kann auf */elementtype [] value ();} angewendet werden@Target wird verwendet, um die Verwendung dieser Annotation zu veranlassen, und die Werte sind:
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ Annotation_type, / ** Paketdeklaration * / Paket, / ** * Typ Parameter Deklaration * @Since 1.8 * / type_parameter, / ** * Verwendung eines Typs * @Since 1.8 * / type_use}Gibt an, wo diese Annotation separat verwendet werden kann: 1) Klasse, Schnittstelle, Annotation, Enum; 2) Attributdomäne; 3) Methode; 4) Parameter; 5) Konstruktor; 6) Lokale Variablen; 7) Annotationstyp; 8) Paket
Also:
@Target (elementtype.method) @Retention (retentionPolicy.source) public @Interface Override {}Dies bedeutet, dass @Override nur für Methoden verwendet werden kann, die auf der Ebene der Quellcode aufbewahrt, vom Compiler verarbeitet und dann verworfen werden.
Es gibt auch eine häufig verwendete Meta -Annotation @Documented:
/** * zeigt an, dass Anmerkungen mit einem Typ standardmäßig von Javadoc * und ähnlichen Tools dokumentiert werden sollen. Dieser Typ sollte verwendet werden, um die * Deklarationen von Typen zu kommentieren, deren Anmerkungen die Verwendung von kommentierten * Elementen durch ihre Kunden beeinflussen. Wenn eine Typdeklaration mit * dokumentiert ist, werden ihre Annotationen Teil der öffentlichen API * der kommentierten Elemente. */@Documented@retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface dokumentiert {} dokumentiert {}Gibt an, ob Anmerkungen von Javadoc verarbeitet und im Dokument aufbewahrt werden können.
2. Anpassen und verarbeiten Sie benutzerdefinierte Anmerkungen mit Meta -Anmerkungen
Mit Meta -Anmerkungen kann ich es verwenden, um die Anmerkungen anzupassen, die wir benötigen. Die Kombination von benutzerdefinierten Anmerkungen und AOP oder Filtern ist eine sehr mächtige Waffe. Beispielsweise können Annotationen verwendet werden, um eine feinkörnige Kontrolle der Berechtigungen zu erreichen. Verwenden Sie Berechtigungsanmerkungen zu Klassen oder Methoden und fangen sie dann in AOP oder Filter ab. Hier finden Sie eine Implementierung der Annotation zu Anmeldeberechtigungen:
/*** Keine Annotation erforderlich*/@target ({elementtype.method, elementtype.type})@retention(retentionPolicy.Runtime)@documentedPublic @Interface Nologin {}Wir haben eine maßgeschneiderte Annotation @nologin, die für Methoden und Klassen verwendet werden kann. Die Annotation wird bis zur Laufzeit beibehalten und kann durch Reflexion gelesen werden. Die Bedeutung dieser Annotation lautet: Die von @nologin kommentierte Klasse oder Methode kann auch dann zugegriffen werden, wenn der Benutzer nicht angemeldet ist. Im Folgenden ist der Prozess der Annotation:
/*** Überprüfen Sie den Login -Interceptor* Wenn Sie die Login nicht überprüfen müssen, können Sie @nologin zur Methode oder dem Controller hinzufügen Handler) löst eine Ausnahme aus {if (! (Handlerinstanz von HandleMethod)) {logger.warn ("Der aktuelle Operation Handler ist nicht handlers. HandleMethod.getMethod (). getName (); // Bestimmen Sie, ob Sie Login Nologin = HandleMethod.getMethod () überprüfen müssen. GetAnnotation (Nologin.Class); if (null! if (null! "Benutzer nicht angemeldet, ip =" + request.getRemoteaddr ()); Antwort.getWriter (). Schreiben (JsonConvertor.ConvertFailResult (FehlerCodeenum.not_login) .ToString ()); // Fehlermeldung zurücksenden; Object Handler, modelAndView modelAndView) löst Ausnahme aus {} @Override public void Aftercompletion (httpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandler, Ausnahme ex) Ausnahme {}}Oben definieren wir einen Anmelde -Interceptor und verwenden zunächst die Reflexion, um festzustellen, ob die Methode von @nologin kommentiert wird:
Nologin nologin = handlermethod.getMethod (). GetAnnotation (nologin.class);
Stellen Sie dann fest, ob die Klasse von @nologin kommentiert wird:
Nologin = HandleMethod.getMethod (). getDeclaringClass (). getAnnotation (nologin.class);
Wenn es kommentiert ist, gibt es wahr zurück. Wenn es nicht kommentiert ist, wird festgestellt, ob es angemeldet wurde. Wenn es nicht angemeldet ist, gibt es Fehlermeldungen in den Vordergrund und falsch zurück. Dies ist ein einfaches Beispiel für die Verwendung von Anmerkungen und Filtern zur Berechtigungsverarbeitung. Wenn wir erweitern, können wir Anmerkungen verwenden, um anzuzeigen, dass auf eine bestimmte Methode oder Klasse nur von Benutzern mit einer bestimmten Rolle oder Berechtigungen zugegriffen werden kann und dann im Filter beurteilt werden kann.
3. Anmerkungen im Zusammenhang mit Frühlingsbohnenbehälter
1) @autowired ist die Annotation, die wir am meisten verwenden. Tatsächlich ist AutoWire = byType eine automatische Injektionsabhängigkeit, die auf dem Typ (Annotationsbasis-Abhängigkeitsinjektion) basiert und in der Domäne, Methode und Konstruktor verwendet werden kann.
2) @Qualifier ist autoWire = byName. Wenn die @autowired Annotation feststellt, dass mehrere Bean -Typen gleich sind, müssen Sie @Qualifier ("xxbean") verwenden, um die ID der abhängigen Bean anzugeben:
@Controller @RequestMapping ("/user") public class hellocontroller {@autowired @Qualifier ("userService") private userService userService;3) @Resource gehört zum JSR250 -Standard und wird in der Domäne und den Methoden verwendet. Es ist auch eine Abhängigkeitsinjektion des Byname -Typs. Verwendungsmethode: @Resource (name = "xxbean"). @Resource ohne Parameter Der Name der Standardwertklasse hat Kleinbuchstaben.
4) Anmerkungen in JSR-330 Standard Javax.inject. @Inject entspricht @autowired, @Named ist @Qualifier entspricht und @Named wird auch in der Klasse als @Component verwendet.
5) @Component, @Controller, @Service, @Repository, diese Anmerkungen unterscheiden sich von den oben genannten Annotationen. Die obigen Anmerkungen werden in die abhängigen Bohnen injiziert, und die Funktion dieser Anmerkungen besteht darin, Bohnen zu produzieren. Diese Anmerkungen werden in der Klasse kommentiert und die Klasse in der Fabrik der Frühlingsbohnen nacheinander in Bohnen annotiert. @Controller, @Service, @Repository ist im Grunde genommen @Component mit raffinierteren Semantik.
6) @postconstruct und @Predestroy werden nicht zur Abhängigkeitsinjektion, sondern für den Lebenszyklus der Bohne verwendet. Ähnlich wie init-Method (initializesingbean) Destory-Methode (DisposableBean)
4. Verarbeitung von Anmerkungen im Frühjahr
Die Verarbeitung von Anmerkungen im Frühjahr erfolgt im Grunde genommen durch Implementierung des Schnittstellenbeanpostprozessors:
öffentliche Schnittstelle BeanPostProcessor {Objekt postprozessbeForeinitialisierung (Objektbean, String Beanname) löst Beansexception aus; Objektpostprozessafterinitialisierung (Objektbean, String Beanname) löst Beansexception aus;}Verwandte Verarbeitungsklassen sind: AutoWiredAnnotationBeanPostProcessor, CommonannotationBeanPostProcessor, PersistenceannotationBeanPostProcessor, fordersAnnotationBeanPostProcessor
Diese Verarbeitungsklassen können implizit im Federcontainer über <Context: Annotation-Config/> konfiguriert werden. Dies sind alle Verarbeitung der Abhängigkeitsinjektion sowie die Verarbeitung von Produktionsbohnenanmerkungen (@Component, @Controller, @Service, @Repository):
<Kontext: Komponenten-scan-Basis-Package = "net.aazj.service, net.aazj.aop" />
Diese werden durchgeführt, indem der gescannte Basispaketpfad angeben und in Federbohnenbehälter gescannt wird. Beachten Sie, dass der Kontext: Komponenten-Scan auch AutoWiredAnnotationBeanPostProcessor und CommonannotationBeanPostProcessor standardmäßig konfigurieren. Daher kann <Kontext: Annotation-Config/> weggelassen werden. Darüber hinaus kann Kontext: Komponenten-Scan auch die AOP-Annotation von @aspect Style Scan scannen, aber es ist erforderlich, <AOP: Aspektj-autoproxy/> der Konfigurationsdatei für die Zusammenarbeit hinzuzufügen.
5. Der Unterschied zwischen Federanmerkungen und JSR-330 Standardanmerkungen:
Zusammenfassen
Bei dem oben genannten geht es darum, die verschiedenen Anmerkungen im Frühling schnell zu verstehen. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!