Što je novo u proljeće 4.3?

1. Pregled

Izdanje Spring 4.3 donijelo je lijepa poboljšanja u spremnik jezgre, predmemoriranje, JMS, Web MVC i testiranje podmodula okvira.

U ovom ćemo postu raspraviti o nekoliko ovih poboljšanja, uključujući:

  • Implicitno ubrizgavanje konstruktora
  • Podrška Java 8 zadanih metoda sučelja
  • Poboljšano rješavanje ovisnosti
  • Poboljšanja apstrakcije predmemorije
  • Sastavljeno @RequestMapping Varijante
  • @Requestscope, @Sessionscope, @Applicationscope Bilješke
  • @RequestAttribute i @SessionAttribute bilješke
  • Podržane verzije knjižnica / poslužitelja aplikacija
  • the InjectionPoint razred

2. Implicitno ubrizgavanje konstruktora

Uzmite u obzir sljedeću klasu usluge:

@Service javna klasa FooService {privatno konačno spremište FooRepository; @Autowired javni FooService (spremište FooRepository) {this.repository = spremište}}

Sasvim čest slučaj upotrebe, ali ako zaboravite @Autowired napomena na konstruktoru, spremnik će izbaciti iznimku tražeći zadani konstruktor, osim ako izričito ne ožičite.

Dakle, od 4.3, više ne morate navoditi eksplicitnu napomenu ubrizgavanja u takvom scenariju s jednim konstruktorom. Ovo je posebno elegantno za nastavu koja uopće ne sadrži napomene:

javna klasa FooService {privatno konačno spremište FooRepository; javna FooService (spremište FooRepository) {this.repository = spremište}}

U proljeće 4.2 i niže, sljedeća konfiguracija za ovaj grah neće raditi, jer proljeće neće moći pronaći zadani konstruktor za FooService. Proljeće 4.3 je pametnije i automatski će spojiti konstruktor automatski:

Slično tome, možda ste to primijetili @Konfiguracija klase povijesno nisu podržavale ubrizgavanje konstruktora. Od 4.3. Rade i prirodno dopuštaju izostavljanje @Autowired u scenariju s jednim konstruktorom:

@Configuration javna klasa FooConfiguration {privatno konačno spremište FooRepository; javna FooConfiguration (spremište FooRepository) {this.repository = spremište; } @Bean public FooService fooService () {return new FooService (this.repository); }}

3. Podrška Java 8 zadanih metoda sučelja

Prije proljeća 4.3, zadane metode sučelja nisu bile podržane.

To nije bilo lako implementirati jer čak ni JDK-ov JavaBean introspector nije prepoznao zadane metode kao pristupnike. Od proljeća 4.3, getteri i postavljači implementirani kao zadane metode sučelja identificiraju se tijekom ubrizgavanja, što omogućuje njihovu upotrebu, na primjer, kao uobičajene pretprocesore za svojstva kojima se pristupa, kao u ovom primjeru:

javno sučelje IDateHolder {void setLocalDate (LocalDate localDate); LocalDate getLocalDate (); zadana praznina setStringDate (String stringDate) {setLocalDate (LocalDate.parse (stringDate, DateTimeFormatter.ofPattern ("dd.MM.yyyy"))); }} 

Ovaj grah sada može imati stringDate ubrizgano svojstvo:

Isto vrijedi i za upotrebu testnih napomena poput @BeforeTransaction i @AfterTransaction na zadanim metodama sučelja. JUnit 5 već podržava svoje testne napomene na zadanim metodama sučelja, a Spring 4.3 slijedi vodstvo. Sada možete apstrahirati uobičajenu testnu logiku u sučelju i primijeniti je u testnim klasama. Evo sučelja za test slučajeve koje bilježe poruke prije i nakon transakcija u testovima:

javno sučelje ITransactionalTest {Logger log = LoggerFactory.getLogger (ITransactionalTest.class); @BeforeTransaction zadana void beforeTransaction () {log.info ("Prije otvaranja transakcije"); } @AfterTransaction zadana void afterTransaction () {log.info ("Nakon zatvaranja transakcije"); }}

Još jedno poboljšanje u vezi s bilješkama @BeforeTransaction,@AfterTransaction i @Transational je popuštanje zahtjeva da anotirane metode budu javnost - sada mogu imati bilo koju razinu vidljivosti.

4. Poboljšano rješavanje ovisnosti

Najnovija verzija također uvodi ObjectProvider, produžetak postojećeg ObjectFactory sučelje s korisnim potpisima poput getIfAvailable i getIfUnique za preuzimanje graha samo ako postoji ili ako se može odrediti jedan kandidat (posebno: primarni kandidat u slučaju više podudarnih graha).

@Service javna klasa FooService {privatno konačno spremište FooRepository; javna FooService (ObjectProvider repositoryProvider) {this.repository = repositoryProvider.getIfUnique (); }}

Možete ih koristiti ObjectProvider ručku za potrebe prilagođene razlučivosti tijekom inicijalizacije kao što je prikazano gore, ili pohranite ručicu u polje za kasno rješavanje na zahtjev (kao što to obično radite s ObjectFactory).

5. Pročišćavanje apstrakcije predmemorije

Apstrakcija predmemorije uglavnom se koristi za predmemoriranje vrijednosti koje troše CPU i IO. U određenim slučajevima korištenja, zadani ključ može zatražiti paralelno nekoliko niti (tj. Klijenti), posebno pri pokretanju. Podrška sinkronizirane predmemorije dugo je tražena značajka koja je sada implementirana. Pretpostavimo sljedeće:

@Service javna klasa FooService {@Cacheable (cacheNames = "foos", sync = true) javni Foo getFoo (ID niza) {...}}

Primijetite sync = true atribut koji govori okviru da blokira sve istodobne niti dok se vrijednost izračunava. To će osigurati da se ova intenzivna operacija poziva samo jednom u slučaju istodobnog pristupa.

Proljeće 4.3 također poboljšava apstrakciju predmemoriranja na sljedeći način:

  • SpEL izrazi u bilješkama povezanim s predmemorijom sada se mogu odnositi na grah (tj. @ beanName.method ()).
  • ConcurrentMapCacheManager i ConcurrentMapCache sada podržavaju serializaciju unosa predmemorije putem novog storeByValue atribut.
  • @Cacheable, @CacheEvict, @CachePut, i @Caching sada se mogu koristiti kao meta-napomene za stvaranje prilagođenih komponiranih napomena s poništavanjem atributa.

6. Sastavljeno @RequestMapping Varijante

Spring Framework 4.3 uvodi sljedeće inačice sastavljene na razini metode @RequestMapping napomene koje pomažu pojednostaviti preslikavanje uobičajenih HTTP metoda i bolje izraziti semantiku metode označenog rukovatelja.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

Na primjer, @GetMapping je kraći oblik kazivanja @RequestMapping (method = RequestMethod.GET). Sljedeći primjer prikazuje MVC kontroler koji je pojednostavljen komponiranim @GetMapping bilješka.

@Controller @RequestMapping ("/ sastanci") javna klasa AppointmentsController {privatna konačna knjiga imenovanjaKnjiga knjige; @Autowired javni AppointmentsController (Knjiga imenovanja za knjigu imenovanja) {this.appointingBook = zakazna knjiga; } @GetMapping javna karta get () {return assignBook.getAppointmentsForToday (); }}

7. @RequestScope, @SessionScope, @ApplicationScope Bilješke

Kada koristite komponente vođene bilješkama ili Java Config, @RequestScope, @SessionScope i @ApplicationScope bilješke se mogu koristiti za dodjeljivanje komponente potrebnom opsegu. Te bilješke ne samo da postavljaju opseg zrna već i postavljaju način djelovanja proxyja s opsegom ScopedProxyMode.TARGET_CLASS.

TARGET_CLASS način znači da će se CGLIB proxy koristiti za proksiranje ovog zrna i osigurati da se može ubrizgati u bilo koji drugi grah, čak i šireg opsega. TARGET_CLASS način omogućuje proksiranje ne samo za sučelja već i za klase.

@RequestScope @Component javna klasa LoginAction {// ...}
@SessionScope @Component javna klasa UserPreferences {// ...}
@ApplicationScope @Component public class AppPreferences {// ...}

8. @RequestAttribute i @SessionAttribute Bilješke

Još dvije napomene za ubrizgavanje parametara HTTP zahtjeva u Kontroler pojavile su se metode, naime @RequestAttribute i @SessionAttribute. Omogućuju vam pristup nekim već postojećim atributima kojima se upravlja globalno (tj. Izvan Kontroler). Vrijednosti za ove atribute mogu pružiti, na primjer, registrirani primjerci javax.servlet.Filter ili org.springframework.web.servlet.HandlerInterceptor.

Pretpostavimo da smo registrirali sljedeće HandlerInterceptor implementacija koja raščlanjuje zahtjev i dodaje prijaviti se parametar sesiji i drugi upit parametar zahtjeva:

javna klasa ParamInterceptor proširuje HandlerInterceptorAdapter {@Override public boolean preHandle (HttpServletRequest zahtjev, HttpServletResponse odgovor, Object handler) baca izuzetak {request.getSession (). setAttribute ("login", "john"); request.setAttribute ("upit", "računi"); return super.preHandle (zahtjev, odgovor, rukovatelj); }}

Takvi se parametri mogu ubrizgati u Kontroler instanca s odgovarajućim bilješkama na argumentima metode:

@GetMapping javni niz get (@SessionAttribute String login, @RequestAttribute String query) {return String.format ("login =% s, query =% s", login, query); }

9. Podrška verzija knjižnica / poslužitelja aplikacija

Proljeće 4.3 podržava sljedeće verzije knjižnice i generacije poslužitelja:

  • Hibernate ORM 5.2 (i dalje podržava 4.2 / 4.3 i 5.0 / 5.1, s 3.6 zastarjelim)
  • Jackson 2.8 (minimalno povišeno na Jackson 2.6+ od proljeća 4.3)
  • OkHttp 3.x (i dalje podržava OkHttp 2.x usporedo)
  • Netty 4.1
  • Podzemna željeznica 1.4
  • Tomcat 8.5.2 kao i 9.0 M6

Nadalje, Spring 4.3 ugrađuje ažurirani ASM 5.1 i Objenesis 2.4 opruga-jezgra.jar.

10. InjectionPoint

The InjectionPoint razred je novi razred predstavljen u proljeće 4.3 pruža informacije o mjestima gdje se određeni grah ubrizgava, bilo da se radi o parametru metode / konstruktora ili o polju.

Vrste podataka koje možete pronaći pomoću ove klase su:

  • Polje objekt - mjesto ubrizgavanja možete dobiti omotano kao Polje objekt pomoću getField () metoda ako se grah ubrizgava u polje
  • MethodParameter - možeš nazvati getMethodParameter () metoda za dobivanje mjesta ubrizgavanja zamotanog kao a MethodParameter objekt ako je grah ubrizgan u parametar
  • Član - pozivanje getMember () metoda vratit će entitet koji sadrži ubrizgani grah umotan u Član objekt
  • Razred - dobiti deklarirani tip parametra ili polja u koje je zrno ubrizgano, pomoću getDeclaredType ()
  • Bilješka [] - pomoću getAnnotations () metodom možete dohvatiti niz Annotation objekata koji predstavljaju bilješke povezane s poljem ili parametrom
  • AnotatedElement - nazovite getAnnotatedElement () kako bi se mjesto ubrizgavanja zamotalo kao AnotatedElement objekt

Slučaj u kojem je ova klasa vrlo korisna je kada želimo stvarati Drvosječa grah na temelju klase kojoj pripada:

@Bean @Scope ("prototip") javni zapisnik dnevnika (InjectionPoint injectionPoint) {return Logger.getLogger (injectionPoint.getMethodParameter (). GetContainingClass ()); }

Grah se mora definirati s prototip opseg tako da se za svaku klasu kreira drugačiji zapisnik. Ako stvorite jednokrevetna grah i ubrizgajte na više mjesta, Proljeće će vratiti prvo naišlo mjesto ubrizgavanja.

Tada možemo ubrizgati grah u naš ImenovanjaController:

@Autowired private Logger logger;

11. Zaključak

U ovom smo članku razgovarali o nekim novim značajkama predstavljenim u Proljeće 4.3.

Pokrili smo korisne napomene koje eliminiraju ploču, nove korisne metode pretraživanja i ubrizgavanja ovisnosti i nekoliko značajnih poboljšanja na mreži i objektima za predmemoriranje.

Izvorni kod za članak možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found