Hvad er nyt i foråret 4.3?

1. Oversigt

Spring 4.3-udgivelsen bragte nogle gode forbedringer i kernebeholdere, caching, JMS, Web MVC og test af undermoduler af rammen.

I dette indlæg vil vi diskutere få af disse forbedringer, herunder:

  • Implicit Constructor Injection
  • Java 8 Standard Interface Methods Support
  • Forbedret løsning af afhængigheder
  • Forbedringer af cache-abstraktion
  • Komponerede @RequestMapping Varianter
  • @Requestscope, @Sessionscope, @Applicationscope Kommentarer
  • @RequestAttribute og @SessionAttribute kommentarer
  • Understøttelse af versioner af biblioteker / applikationsservere
  • det Injektionspunkt klasse

2. Implicit konstruktørinjektion

Overvej følgende serviceklasse:

@Service offentlig klasse FooService {privat endelig FooRepository repository; @Autowired public FooService (FooRepository repository) {this.repository = repository}}

En ret almindelig brugssag, men hvis du glemmer @Autowired kommentar på konstruktøren, beholderen kaster en undtagelse på udkig efter en standardkonstruktør, medmindre du udtrykkeligt foretager ledningerne.

Så fra og med 4.3 behøver du ikke længere angive en eksplicit injektionsnotering i et sådant enkeltkonstruktorscenario. Dette er særligt elegant til klasser, der slet ikke indeholder nogen kommentarer:

offentlig klasse FooService {privat endelig FooRepository repository; offentlig FooService (FooRepository repository) {this.repository = repository}}

I Spring 4.2 og derunder fungerer den følgende konfiguration for denne bønne ikke, fordi Spring ikke kan finde en standardkonstruktør til FooService. Forår 4.3 er smartere og vil automatisk tråde konstruktøren automatisk:

På samme måde har du måske bemærket det @Konfiguration klasser understøttede historisk ikke konstruktørinjektion. Fra 4.3 gør de det, og de tillader naturligvis udeladelse @Autowired også i et enkelt konstruktorscenario:

@Configuration offentlig klasse FooConfiguration {privat endelig FooRepository repository; offentlig FooConfiguration (FooRepository repository) {this.repository = repository; } @Bean public FooService fooService () {returner ny FooService (this.repository); }}

3. Java 8 Understøttelse af standardgrænseflademetoder

Før foråret 4.3 blev standardgrænseflademetoder ikke understøttet.

Dette var ikke let at implementere, fordi selv JDKs JavaBean introspector ikke registrerede standardmetoder som accessors. Siden foråret 4.3 identificeres getters og settere, der er implementeret som standardgrænseflademetoder under injektionen, hvilket giver mulighed for at bruge dem for eksempel som almindelige forprocessorer for tilgængelige egenskaber, som i dette eksempel:

offentlig grænseflade IDateHolder {void setLocalDate (LocalDate localDate); LocalDate getLocalDate (); standard ugyldigt setStringDate (String stringDate) {setLocalDate (LocalDate.parse (stringDate, DateTimeFormatter.ofPattern ("dd.MM.yyyy"))); }} 

Denne bønne kan nu have stringDate ejendom injiceret:

Det samme gælder for brug af testkommentarer som f.eks @BeforeTransaction og @AfterTransaction på standardgrænseflademetoder. JUnit 5 understøtter allerede sine testkommentarer om standardgrænseflademetoder, og Spring 4.3 følger føringen. Nu kan du abstrakte almindelig testlogik i en grænseflade og implementere den i testklasser. Her er en grænseflade til testsager, der logger meddelelser før og efter transaktioner i tests:

offentlig grænseflade ITransactionalTest {Logger log = LoggerFactory.getLogger (ITransactionalTest.class); @BeforeTransaction standard ugyldig før Transaktion () {log.info ("Før åbning af transaktion"); } @AfterTransaction standard ugyldig efterTransaktion () {log.info ("Efter afslutning af transaktion"); }}

En anden forbedring med hensyn til kommentarer @BeforeTransaction,@AfterTransaction og @Transaktionel er lempelsen af ​​kravet om, at de kommenterede metoder skal være offentlig - nu har de muligvis ethvert synlighedsniveau.

4. Forbedret løsning af afhængigheder

Den nyeste version introducerer også Objektudbyder, en udvidelse af den eksisterende ObjectFactory interface med praktiske signaturer som f.eks getIfAvailable og getIfUnique at kun hente en bønne, hvis den findes, eller hvis en enkelt kandidat kan bestemmes (især: en primær kandidat i tilfælde af flere matchende bønner).

@Service offentlig klasse FooService {privat endelig FooRepository repository; offentlig FooService (ObjectProvider repositoryProvider) {this.repository = repositoryProvider.getIfUnique (); }}

Du kan bruge sådan Objektudbyder håndtag til brugerdefinerede opløsningsformål under initialisering som vist ovenfor, eller opbevar håndtaget i et felt til sen opløsning på forespørgsel (som du typisk gør med en ObjectFactory).

5. Forbedringer af cache-abstraktion

Cache-abstraktionen bruges hovedsageligt til at cache værdier, der bruger CPU og IO. I særlige brugstilfælde kan en given nøgle anmodes om af flere tråde (dvs. klienter) parallelt, især ved opstart. Synkroniseret cache-understøttelse er en funktion, der længe efterspørges, og som nu er implementeret. Antag følgende:

@Service offentlig klasse FooService {@Cacheable (cacheNames = "foos", sync = true) offentlig Foo getFoo (streng-id) {...}}

Læg mærke til synkronisering = sand attribut, der fortæller rammen om at blokere eventuelle samtidige tråde, mens værdien beregnes. Dette vil sikre, at denne intensive operation kun påberåbes en gang i tilfælde af samtidig adgang.

Forår 4.3 forbedrer også cache-abstraktionen som følger:

  • SpEL-udtryk i cache-relaterede kommentarer kan nu henvise til bønner (dvs. @ beanName.method ()).
  • ConcurrentMapCacheManager og ConcurrentMapCache understøtter nu serialisering af cacheindgange via en ny storeByValue attribut.
  • @Cacheable, @CacheEvict, @CachePutog @Caching kan nu bruges som meta-annoteringer til at oprette brugerdefinerede sammensatte annoteringer med attributtilsidesættelser.

6. Komponerede @RequestMapping Varianter

Spring Framework 4.3 introducerer følgende varianter af metodeniveau sammensat af @RequestMapping annotation, der hjælper med at forenkle tilknytninger til almindelige HTTP-metoder og bedre udtrykke semantikken i den annoterede handler-metode.

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

For eksempel, @GetMapping er en kortere form for ordsprog @RequestMapping (metode = RequestMethod.GET). Følgende eksempel viser en MVC-controller, der er blevet forenklet med en komponeret @GetMapping kommentar.

@Controller @RequestMapping ("/ aftaler") offentlig klasse AftalerController {privat endelig Aftalebog aftaleBog; @Autowired public AppointmentsController (AppointmentBook appointmentBook) {this.appointmentBook = appointmentBook; } @GetMapping public Map get () {return appointmentBook.getAppointmentsForToday (); }}

7. @RequestScope, @SessionScope, @ApplicationScope Kommentarer

Når du bruger annoteringsdrevne komponenter eller Java Config, @RequestScope, @SessionScope og @ApplicationScope annoteringer kan bruges til at tildele en komponent til det krævede omfang. Disse bemærkninger indstiller ikke kun omfanget af bønnen, men indstiller også den scoped proxy-tilstand til ScopedProxyMode.TARGET_CLASS.

TARGET_CLASS tilstand betyder, at CGLIB proxy vil blive brugt til proxying af denne bønne og sikre, at den kan injiceres i enhver anden bønne, selv med et bredere omfang. TARGET_CLASS tilstand tillader proxying ikke kun for grænseflader men også klasser.

@RequestScope @Komponent offentlig klasse LoginAction {// ...}
@SessionScope @Component offentlig klasse UserPreferences {// ...}
@ApplicationScope @ Komponent offentlig klasse AppPreferences {// ...}

8. @RequestAttribute og @SessionAttribute Kommentarer

To yderligere kommentarer til indsprøjtning af parametre for HTTP-anmodningen i Controller metoder dukkede op, nemlig @RequestAttribute og @SessionAttribute. De giver dig adgang til nogle eksisterende attributter, der administreres globalt (dvs. uden for Controller). Værdierne for disse attributter kan for eksempel tilvejebringes af registrerede forekomster af javax.servlet.Filter eller org.springframework.web.servlet.HandlerInterceptor.

Antag, at vi har registreret følgende HandlerInterceptor implementering, der analyserer anmodningen og tilføjer Log på parameter til sessionen og en anden forespørgsel parameter til en anmodning:

offentlig klasse ParamInterceptor udvider HandlerInterceptorAdapter {@Override public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throw Exception {request.getSession (). setAttribute ("login", "john"); request.setAttribute ("forespørgsel", "fakturaer"); returner super.preHandle (anmodning, svar, handler); }}

Sådanne parametre kan injiceres i en Controller forekomst med tilsvarende bemærkninger om metodeargumenter:

@GetMapping public String get (@SessionAttribute String login, @RequestAttribute String query) {return String.format ("login =% s, query =% s", login, forespørgsel); }

9. Støtte til versioner af biblioteker / applikationsservere

Spring 4.3 understøtter følgende biblioteksversioner og servergenerationer:

  • Dvaletilstand ORM 5.2 (understøtter stadig 4.2 / 4.3 og 5.0 / 5.1 også med 3.6 udfaset nu)
  • Jackson 2.8 (minimum hævet til Jackson 2.6+ fra og med foråret 4.3)
  • OkHttp 3.x (understøtter stadig OkHttp 2.x side om side)
  • Netty 4.1
  • Undertow 1.4
  • Tomcat 8.5.2 samt 9,0 M6

Desuden integrerer Spring 4.3 den opdaterede ASM 5.1 og Objenesis 2.4 in spring-core.jar.

10. Injektionspunkt

Det Injektionspunkt klasse er en ny klasse, der blev introduceret i foråret 4.3, hvilken giver oplysninger om steder, hvor en bestemt bønne injiceres, hvad enten det er en metode / konstruktorparameter eller et felt.

De typer information, du kan finde ved hjælp af denne klasse, er:

  • Mark objekt - du kan få injektionsstedet pakket som en Mark objekt ved hjælp af getField () metode, hvis bønnen injiceres i et felt
  • Metode Parameter - du kan ringe getMethodParameter () metode til at opnå injektionsstedet indpakket som en Metode Parameter objekt, hvis bønnen injiceres i en parameter
  • Medlem - ringer getMember () metoden returnerer den enhed, der indeholder den injicerede bønne pakket ind i en Medlem objekt
  • Klasse - opnå den deklarerede type af parameteren eller feltet, hvor bønnen injiceres ved hjælp af getDeclaredType ()
  • Kommentar [] - ved hjælp af getAnnotations () metode, kan du hente en matrix af annoteringsobjekter, der repræsenterer de bemærkninger, der er knyttet til feltet eller parameteren
  • Annoteret element - opkald getAnnotatedElement () for at få injektionsstedet pakket som en Annoteret element objekt

Et tilfælde, hvor denne klasse er meget nyttig, er når vi vil oprette Logger bønner baseret på den klasse, de tilhører:

@Bean @Scope ("prototype") offentlig Logger-logger (InjectionPoint injectionPoint) {returner Logger.getLogger (injectionPoint.getMethodParameter (). GetContainingClass ()); }

Bønnen skal defineres med en prototype omfang, så der oprettes en anden logger for hver klasse. Hvis du opretter en singleton bønne og injicere flere steder, vil foråret returnere det første stødte injektionssted.

Derefter kan vi injicere bønnen i vores Aftaler Kontrol:

@Autowired privat logger-logger;

11. Konklusion

I denne artikel diskuterede vi nogle af de nye funktioner, der blev introduceret med Spring 4.3.

Vi har dækket nyttige kommentarer, der eliminerer kedelplade, nye nyttige metoder til afhængighedsopslag og injektion og flere væsentlige forbedringer inden for nettet og cachefaciliteter.

Du kan finde kildekoden til artiklen på GitHub.


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