Wie ich jedes Mal schreibe und sage, gibt es auch jetzt, wenn wir uns 2020 nähern, nur zwei zuverlässige Bücher zum Thema Frühling:
Beide Bücher (im Folgenden als "Bücher" bezeichnet) sind super gute Bücher, aber beide wurden 2016 veröffentlicht und die unterstützte Spring-Version ist so alt wie 4.2.
Die neueste Version per Ende 2019 ist Spring 5.2. In diesem Artikel werde ich einige Punkte vorstellen, auf die Sie beim Lesen der oben genannten Bücher jetzt besonders achten sollten.
Überprüfen Sie das GitHub-Wiki (https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions) auf alle Unterschiede in 4.x-> 5.x. ..
Ab Spring 5.0 beträgt die JDK-Basislinie 8 (Spring 4 basiert auf JDK 6). Ich glaube nicht, dass Leute, die Spring von nun an verwenden möchten, versuchen werden, JDK 6 oder 7 zu verwenden.
Spring 5.2 unterstützt bis zu JDK 14. Weitere Informationen zur Unterstützung der JDK- und Spring-Version finden Sie im GitHub-Wiki (https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range). ..
@ Autowired
sollte abgekürzt werdenSeit Frühjahr 4.2 gibt es drei DI-Methoden.
Beispiel einer Feldinjektion
@Component
public class Hoge {
@Autowired
Fuga fuga;
}
Beispiel für Setterinjektion
@Component
public class Hoge {
private Fuga fuga;
@Autowired
public void setFuga(Fuga fuga) {
this.fuga = fuga;
}
}
Beispiel einer Konstruktorinjektion
@Component
public class Hoge {
private final Fuga fuga;
@Autowired
public Hoge(Fuga fuga) {
this.fuga = fuga;
}
}
Feldinjektion wird häufig in Büchern verwendet. Wahrscheinlich, weil der Umfang der Beschreibung am geringsten ist (möglicherweise aufgrund von Platzbeschränkungen).
Ab Spring 4.3 kann @ Autowired
weggelassen werden, wenn nur ein Konstruktor in der Klasse vorhanden ist.
Beispiel einer Konstruktorinjektion (4.3 oder später)
@Component
public class Hoge {
private final Fuga fuga;
//Weil es nur einen Konstruktor gibt@Autowired ist optional!
public Hoge(Fuga fuga) {
this.fuga = fuga;
}
}
Sie können Ihre Klasse unveränderlich machen, verwenden Sie also nach Möglichkeit die Konstruktorinjektion.
Verwenden Sie "@ RequestMapping", um Controller-Klassenmethoden in Spring MVC zu schreiben.
4.2 oder früher
@Controller
@RequestMapping("/hoge")
public class HogeController {
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index() {
return "index";
}
}
Ab Frühjahr 4.3 wurden Anmerkungen für jede HTTP-Anforderungsmethode wie "@ GetMapping" und "@ PostMapping" eingeführt. Sie können es sehr kurz schreiben!
4.3 oder später
@Controller
@RequestMapping("/hoge") //Hier@Request Mapping ist OK
public class HogeController {
@GetMapping("/index") // @Verwenden Sie XxxMapping!
public String index() {
return "index";
}
}
Das Buch verwendet Thymeleaf 2. Um einen Bildschirm in Thymeleaf 2 zu schreiben, müssen Sie ihn im XHTML-Format schreiben.
Wenn Sie eine Bibliothek hinzufügen, können Sie sogar 2 im HTML-Format schreiben.
2 oder früher
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Bildschirm</title>
</head>
<body>
<form action="index.html" th:action="@{findByFirstName}">
Vorname Schlüsselwort:<input type="text" name="firstName" />
<input type="submit" value="Suche" />
</form>
...
Mit Thymeleaf 3 können Sie standardmäßig im HTML-Format schreiben.
3 oder später
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Bildschirm</title>
</head>
<body>
<form action="index.html" th:action="@{findByFirstName}">
Vorname Schlüsselwort:<input type="text" name="firstName">
<input type="submit" value="Suche">
</form>
...
Ich bin froh, dass ich /
vergessen habe und es gibt keine Laufzeitausnahmen!
In Spring 4.3 und früheren Versionen erbt beim Erstellen einer Spring MVC-bezogenen Java-Konfiguration häufig die Klasse "WebMvcConfigurerAdapter".
4.3 oder früher
@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
...
}
...
}
Ab Spring 5.0 ist diese Klasse veraltet und es wird empfohlen, die von dieser Klasse implementierte WebMvcConfigurer-Schnittstelle zu verwenden.
5.Nach 0
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
...
}
...
}
Die Klasse "WebMvcConfigurerAdapter" ist eine Klasse, die die Schnittstelle "WebMvcConfigurer" implementiert und alle Methoden mit einer leeren Implementierung überschreibt. Da Java 8 basiert, sind alle Methoden der WebMvcConfigurer-Schnittstelle jetzt Standardmethoden mit leeren Implementierungen. Dies ist das Ende des Jobs, und die Klasse "WebMvcConfigurerAdapter" ist veraltet.
[Quellcode für "WebMvcConfigurer"](https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation /WebMvcConfigurer.java)
@ NotBlank
anstelle von Hibernate Validator @ NotBlank
Mit der Unterstützung von Java EE 8 ab Spring 5 wurde die Bean Validation-Version von 1.x auf 2.0 (Hibernate Validator 6.0 oder höher) erhöht.
Es ist möglich, Bean Validation 1.x mit Spring 5 zu verwenden, aber im Grunde ist es besser, die neueste Version zu verwenden.
Bean Validation 2.0 fügt eine neue Einschränkungsanmerkung hinzu. Einige davon waren Anmerkungen von Hibernate Validator und wurden in den Bean Validation-Standard aufgenommen. Insbesondere lauten die Anmerkungen wie folgt (alle im Paket "javax.validation.constraints").
@NotEmpty
@NotBlank
@Email
Infolgedessen sind die eigenen "@ NotBlank" -, "@ NotEmpty" - und "@ Email" -Pakete von Hibernate Validator (alle "org.hibernate.validator.constraints" -Pakete) veraltet.
Ab Spring Data 2.x wurden der Name und der Rückgabewert der in "CrudRepository" definierten Methode geändert.
Die Änderungen umfassen die Unterstützung von "java.util.Optional" und Änderungen des Methodennamens.
Crud Repository vor 1
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> save(Iterable<S> entities);
T findOne(ID id);
boolean exists(ID id);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> ids);
long count();
void delete(ID id);
void delete(T entity);
void delete(Iterable<? extends T> entities);
void deleteAll();
}
2 oder höher Crud Repository
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
PasswordEncoder
sollte immer explizit festgelegt werdenVor Spring Security 4 wurde kein Kennwort-Hashing durchgeführt, wenn Sie "PasswordEncoder" nicht explizit angegeben haben.
Ab Spring Security 5 wird "DelegatingPasswordEncoder" verwendet, wenn Sie "PasswordEncoder" nicht explizit angeben. Dies liest das Präfix des in der Datenbank gespeicherten Passworts usw. und delegiert die Verarbeitung an den entsprechenden "PasswordEncoder".
Ich glaube nicht, dass jemand in der Produktion "PasswordEncoder" angegeben hat (das möchte ich glauben). Ich denke jedoch, dass es Zeiten gab, in denen ich es der Einfachheit halber nicht im Studiencode angegeben habe. Stellen Sie sicher, dass Sie dies in Spring Security 5.x oder höher angeben. Sie müssen lediglich eine Bean für "PasswordEncoder" definieren. Natürlich sollten in DB usw. gespeicherte Passwörter mit "PasswordEncoder" desselben Algorithmus gehasht werden.
Geben Sie den Passwort-Encoder an
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Für Spring Boot 1.x-> 2.x gibt es zu viele Änderungen, um w zu schreiben
Auch wenn Sie nur daran denken
···etc. Es kann viele andere geben.
Ich werde die Materialien hinzufügen, die auf der JSUG-Studiensitzung vorgestellt wurden. Beide sind wertvolle Materialien, also lesen Sie sie bitte!
Wenn Sie sich erinnern, werde ich es eins nach dem anderen hinzufügen.