1. Interceptors und Filter
Bevor Sie über Spring Stiefel sprechen, schauen wir uns zunächst Filter und Interceptors an. Die beiden sind in Bezug auf Funktionen sehr ähnlich, aber es gibt immer noch eine große Lücke in der spezifischen technischen Implementierung. Lassen Sie uns vor der Analyse der Unterschiede zwischen den beiden zunächst das Konzept der AOP verstehen. AOP ist keine bestimmte Technologie, sondern eine Programmidee. Im Prozess der objektorientierten Programmierung fällt es uns leicht, die vertikale Expansion durch Vererbung und Polymorphismus zu lösen. Für horizontale Funktionen, wie z. B. das Aktivieren von Transaktionen in allen Servicemethoden oder eine einheitliche Protokollierung, können objektorientierte Funktionen nicht gelöst werden. Daher ist eine AOP-orientierte Programmierung tatsächlich eine Ergänzung zur Idee der objektorientierten Programmierung. Die Filter und Interceptors, über die wir heute sprechen, sind beide spezifische Implementierungen von Aspektorientierter Programmierung. Die Hauptunterschiede zwischen beiden umfassen die folgenden Aspekte:
1. Filter hängt von Servlet -Containern ab und ist Teil der Servlet -Spezifikation. Interceptors existieren unabhängig und können unter allen Umständen verwendet werden.
2. Die Ausführung des Filters wird durch den Servlet -Container -Rückruf abgeschlossen, und der Interceptor wird normalerweise über einen dynamischen Proxy ausgeführt.
3. Der Lebenszyklus des Filters wird vom Servlet -Container verwaltet, während der Interceptor über IOC -Behälter verwaltet werden kann. Daher können Fälle anderer Bohnen durch Injektion und andere Methoden erhalten werden, sodass es bequemer zu verwenden ist.
2. Filterkonfiguration
Jetzt verwenden wir Filter, um die Funktion der Ausführungszeit von Anforderungen zu erkennen, die wie folgt implementiert werden:
public class logCostFilter implementiert filter {@Override public void init (filterconfig filterconfig) löst ServletException aus {} @Override public void dofilter (servletRequest servletRequest, ServletResplet -ServletResponse, Filterchain Filterchain). filterchain.dofilter (ServletRequest, ServletResponse); System.out.println ("ausführen cost ="+(System.currentTimemillis ()-start)); } @Override public void destroy () {}}Die Logik dieses Codes ist relativ einfach, nämlich den Zeitstempel aufzuzeichnen, bevor die Methode ausgeführt wird, und dann die Ausführung der Anforderung über die Filterkette abgeschlossen und die Ausführungszeit zwischen den zurückgegebenen Ergebnissen berechnet. Die Hauptsache hier ist, dass diese Klasse die Filterklasse erben muss. Dies ist die Spezifikation von Servlet, die sich nicht von früheren Webprojekten unterscheidet. Mit der Filterklasse können die vorherigen Webprojekte jedoch in web.xml konfiguriert werden, aber das Spring -Boot -Projekt enthält nicht die Web.xml -Datei. Wie konfigurieren Sie sie? Im Spring Start benötigen wir eine Filterregistrierungsbean, um die Konfiguration zu vervollständigen. Der Implementierungsprozess ist wie folgt:
@ConfigurationPublic Class FilterConfig {@Bean public filterregistrationBean RegistrationFilter () {FilterregistrationBean Registration = new FilterregistrationBean (); Registration.SetFilter (neuer LogCostFilter ()); Registrierung.Addurlpatterns ("/*"); Registrierung.SetName ("LogCostFilter"); Registrierung.Setorder (1); Rückgaberegistrierung; }}Diese Konfiguration ist abgeschlossen. Die Optionen, die konfiguriert werden müssen, beinhalten hauptsächlich die Instanziierung der Filterklasse und geben dann das Übereinstimmungsmuster der URL an, wodurch der Filtername und die Ausführungsreihenfolge festgelegt werden. Dieser Prozess unterscheidet sich nicht von der Konfiguration in Web.xml, aber das Formular ist einfach anders. Jetzt können wir den Server starten, um auf jede URL zuzugreifen:
Sie können sehen, dass die oben genannte Konfiguration wirksam hat. Zusätzlich zur Konfiguration über die Filterregistrierungsbean gibt es auch einen direkteren Weg, der direkt über Anmerkungen abgeschlossen werden kann:
@WebFilter(urlPatterns = "/*", filterName = "logFilter2")public class LogCostFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) löscht ioException, servleTException {long start = system.currentTimemillis (); filterchain.dofilter (ServletRequest, ServletResponse); System.out.println ("logFilter2 führen cost =" + (System.currentTimemillis () - Start)); } @Override public void destroy () {}}Hier können Sie es direkt mit @Webfilter konfigurieren. In ähnlicher Weise können Sie den URL -Matching -Modus, den Filternamen usw. festlegen. Eine Sache, die hier zu beachten ist, ist, dass die Annotation @Webfilter eine Spezifikation von Servlet 3.0 ist und nicht von Spring Boot bereitgestellt wird. Zusätzlich zu dieser Annotation müssen wir der Konfigurationsklasse eine weitere Annotation hinzufügen: @ServletComponetscan, die das gescannte Paket angeben.
@SpringBootApplication@mapperscan ("com.pandy.blog.dao")@ServletComponentscan ("com.pandy.blog.filters") öffentliche Klassenanwendung {public static void main (String [] args) Ausnahme {SpringApplication.run (Application.class.class, args, args, args, args, args, args, args, args); }} Lassen Sie uns nun noch einmal eine URL besuchen:
Wie Sie sehen können, haben beide von uns konfigurierten Filter wirksam. Sorgfältige Leser werden feststellen, dass wir nicht die Ausführung der Ausführung des zweiten Filters angeben, sondern vor dem ersten Filter ausführen. Hier sollte erklärt werden, dass die @Webfilter -Annotation das Attribut zur Ausführungsreihenfolge nicht angibt. Die Ausführungsreihenfolge hängt vom Namen des Filters ab und wird in umgekehrter Reihenfolge basierend auf der alphabetischen Reihenfolge des Filterklassennamens angeordnet (beachten Sie, dass es nicht der Name des konfigurierten Filters ist). Die von @Webfilter angegebene Filterpriorität ist höher als der von der Filterregistrierungsbean konfigurierte Filter. Freunde, die interessiert sind, können alleine experimentieren.
3.. Interceptor -Konfiguration
Wir haben bereits die oben genannte Filterkonfigurationsmethode eingeführt. Schauen wir uns als nächstes an, wie Sie einen Interceptor konfigurieren. Wir verwenden einen Interceptor, um dieselbe Funktion oben zu implementieren und die Ausführungszeit der Anfrage zu erfassen. Zuerst implementieren wir die Interceptor -Klasse:
public class logCostInterceptor implementiert handlerinterceptor {long start = system.currentTimemillis (); @Override public boolean prehandle (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Objekt O) Ausnahme ausreihen {start = system.currentTimemillis (); zurückkehren; } @Override public void posthandle (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Object O, modelandView modelandView löst eine Ausnahme aus {System.out.println ("Interceptor cost ="+(system.curentTimillis ()-start). } @Override public void AfterCompletion (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Objekt O, Ausnahme E) Ausnahme {}}Hier müssen wir die Handlerinterzeptor -Schnittstelle implementieren. Diese Schnittstelle enthält drei Methoden. Der Vorhand wird vor der Ausführung der Anfrage ausgeführt, und der Nachhandler wird nach Ausführung der Anfrage ausgeführt, wird jedoch nur ausgeführt, wenn die Prehandle -Methode true zurückgibt. Nach Abschluss der Ansichtswiedergabe wird die Nachkommen ausgeführt. Prehandle muss auch wahr zurückkehren. Diese Methode wird normalerweise zum Reinigen von Ressourcen und anderen Aufgaben verwendet. Zusätzlich zur Implementierung der obigen Schnittstelle müssen wir sie auch konfigurieren:
@ConfigurationPublic Class InterceptorConfig erweitert webmvcconFigurerAdapter {@Override public void addInterceptors (InterceptorRegistry -Registrierung) {Registry.AdDInterceptor (neuer LogCostInterceptor ()). Super.AdDInterceptors (Registrierung); }}Hier haben wir WebMVCConFigurerAdapter geerbt. Freunde, die die vorherigen Artikel gelesen haben, sollten diese Klasse gesehen haben. Wir haben diese Klasse bei der Konfiguration des statischen Ressourcenverzeichnisses verwendet. Hier haben wir die AddInterceptors -Methode zur Konfiguration des Interceptors neu geschrieben. Es gibt zwei Hauptkonfigurationselemente: Eine besteht darin, den Interceptor anzugeben, und der andere besteht darin, die Interceptor -URL anzugeben. Jetzt starten wir das System und greifen auf eine URL zu:
Wie Sie sehen können, haben wir die gleiche Funktion durch den Interceptor erreicht. Hier ist jedoch zu beachten, dass diese Implementierung tatsächlich problematisch ist, da Prehandle und Posthandle zwei Methoden sind. Daher müssen wir einen gemeinsam genutzten Variablen -Start festlegen, um den Startwert zu speichern, aber dies wird die Sicherheitsprobleme von Threads aufweisen. Natürlich können wir dieses Problem durch andere Methoden wie ThreadLocal lösen, die gut gelöst werden können, und Schüler, die interessiert sind, können es selbst implementieren. Dadurch können wir jedoch tatsächlich erkennen, dass Interceptors zwar in vielen Szenarien besser sind als Filter, in diesem Szenario jedoch Filter einfacher zu implementieren sind als Interceptors.
4. Zusammenfassung
In diesem Artikel wird hauptsächlich die Konfiguration von Filtern und Interceptors basierend auf Spring Boot erläutert. Sowohl Filter als auch Interceptors gehören zur spezifischen Implementierung der AOP-Idee (Abschnitt-orientierte Programmierung). Zusätzlich zu diesen beiden Implementierungen haben wir auch eine weitere flexiblere AOP -Implementierungstechnologie gesehen, nämlich Aspekt, in dem wir immer leistungsfähigere Funktionen durch Aspekt erfüllen können. Ich werde das später mit Ihnen teilen.