Hva er nytt våren 4.3?

1. Oversikt

Spring 4.3-utgivelsen brakte noen fine forbedringer i kjernebeholdere, caching, JMS, Web MVC og testing av undermoduler av rammeverket.

I dette innlegget vil vi diskutere noen av disse forbedringene, inkludert:

  • Implisitt konstruktørinjeksjon
  • Java 8 Standard Interface Methods Support
  • Forbedret løsning av avhengigheter
  • Cache Abstraction Refinements
  • Komponert @RequestMapping Varianter
  • @Requestscope, @Sessionscope, @Applicationscope Kommentarer
  • @RequestAttribute og @SessionAttribute kommentarer
  • Støtte for versjoner av biblioteker / applikasjonsservere
  • de Injeksjonspunkt klasse

2. Implisitt konstruktørinjeksjon

Vurder følgende serviceklasse:

@Service public class FooService {private final FooRepository repository; @Autowired public FooService (FooRepository repository) {this.repository = repository}}

Ganske vanlig brukstilfelle, men hvis du glemmer @Autowired kommentar på konstruktøren, vil containeren kaste et unntak på jakt etter en standard konstruktør, med mindre du eksplisitt gjør ledningene.

Så fra og med 4.3 trenger du ikke lenger å spesifisere en eksplisitt injeksjonsnotering i et slikt enkeltkonstruktorscenario. Dette er spesielt elegant for klasser som ikke har noen merknader i det hele tatt:

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

På våren 4.2 og under vil ikke følgende konfigurasjon for denne bønnen fungere, fordi Spring ikke vil kunne finne en standardkonstruktør for FooService. Våren 4.3 er smartere og vil automatisk koble konstruktøren automatisk:

På samme måte har du kanskje lagt merke til det @Konfigurasjon klasser støttet historisk ikke konstruktørinjeksjon. Fra og med 4.3 gjør de det, og de tillater naturlig nok utelatelse @Autowired i et enkeltkonstruktorscenario også:

@Configuration public class FooConfiguration {private final FooRepository repository; offentlig FooConfiguration (FooRepository repository) {this.repository = repository; } @Bean public FooService fooService () {returner ny FooService (this.repository); }}

3. Støtte for Java 8 standard grensesnittmetoder

Før våren 4.3 ble ikke standardgrensesnittmetoder støttet.

Dette var ikke lett å implementere fordi selv JDKs JavaBean introspector ikke oppdaget standardmetoder som aksessorer. Siden våren 4.3 identifiseres getters og settere som er implementert som standard grensesnittmetoder under injeksjonen, noe som gjør det mulig å bruke dem for eksempel som vanlige forprosessorer for tilgjengelige egenskaper, som i dette eksemplet:

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

Denne bønnen kan nå ha stringDate eiendom injisert:

Det samme gjelder bruk av testkommentarer som @BeforeTransaction og @AfterTransaction på standardgrensesnittmetoder. JUnit 5 støtter allerede sine testkommentarer om standardgrensesnittmetoder, og Spring 4.3 følger ledelsen. Nå kan du abstrakte vanlig testlogikk i et grensesnitt og implementere den i testklasser. Her er et grensesnitt for testsaker som logger meldinger før og etter transaksjoner i tester:

offentlig grensesnitt ITransactionalTest {Logger log = LoggerFactory.getLogger (ITransactionalTest.class); @BeforeTransaction standard ugyldig før Transaksjon () {log.info ("Før du åpner transaksjonen"); } @AfterTransaction standard ugyldig etterTransaksjon () {log.info ("Etter avsluttet transaksjon"); }}

Nok en forbedring når det gjelder merknader @BeforeTransaction,@AfterTransaction og @Transaksjonell er lempelsen av kravet om at de merkede metodene skal være offentlig - nå kan de ha noe siktnivå.

4. Forbedret løsning av avhengigheter

Den nyeste versjonen introduserer også Objektleverandør, en utvidelse av det eksisterende ObjectFactory grensesnitt med praktiske signaturer som getIfAvailable og getIfUnique å hente en bønne bare hvis den eksisterer, eller hvis en enkelt kandidat kan bestemmes (spesielt: en primærkandidat i tilfelle flere matchende bønner).

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

Du kan bruke slike Objektleverandør håndtak for egendefinerte oppløsningsformål under initialisering som vist ovenfor, eller lagre håndtaket i et felt for sent på forespørsel (som du vanligvis gjør med en ObjectFactory).

5. Cache Abstraction Refinements

Cache-abstraksjonen brukes hovedsakelig til å cache verdier som bruker CPU og IO. I spesielle brukstilfeller kan en gitt nøkkel bli bedt om av flere tråder (dvs. klienter) parallelt, spesielt ved oppstart. Synkronisert cache-støtte er en lang etterspurt funksjon som nå er implementert. Anta følgende:

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

Legg merke til synkronisering = sann attributt som forteller rammeverket å blokkere alle samtidige tråder mens verdien beregnes. Dette vil sørge for at denne intensive operasjonen kun påberopes en gang i tilfelle tilgang samtidig.

Våren 4.3 forbedrer også cache-abstraksjonen som følger:

  • SpEL-uttrykk i hurtigbaserte kommentarer kan nå referere til bønner (dvs. @ beanName.method ()).
  • ConcurrentMapCacheManager og ConcurrentMapCache støtter nå serialisering av cacheoppføringer via en ny storeByValue Egenskap.
  • @Cacheable, @CacheEvict, @CachePut, og @Caching kan nå brukes som metaanmerkninger for å lage tilpassede sammensatte merknader med attributtoverstyringer.

6. Komponerte @RequestMapping Varianter

Spring Framework 4.3 introduserer følgende metodenivå sammensatte varianter av @RequestMapping merknader som hjelper til med å forenkle kartlegginger for vanlige HTTP-metoder og bedre uttrykke semantikken til den merkede håndteringsmetoden.

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

For eksempel, @GetMapping er en kortere form for å si @RequestMapping (metode = RequestMethod.GET). Følgende eksempel viser en MVC-kontroller som er forenklet med en komponert @GetMapping kommentar.

@Controller @RequestMapping ("/ avtaler") offentlig klasse AvtalerKontroller {privat slutt AvtaleBok avtaleBok; @Autowired public AppointmentsController (AppointmentBook appointmentBook) {this.appointmentBook = appointmentBook; } @GetMapping public Map get () {retur avtaleBook.getAppointmentsForToday (); }}

7. @RequestScope, @SessionScope, @ApplicationScope Kommentarer

Når du bruker merknadsdrevne komponenter eller Java Config, @RequestScope, @SessionScope og @ApplicationScope merknader kan brukes til å tilordne en komponent til ønsket omfang. Disse kommentarene setter ikke bare omfanget av bønnen, men setter også den fullstendige proxy-modusen til ScopedProxyMode.TARGET_CLASS.

TARGET_CLASS modus betyr at CGLIB proxy vil bli brukt til proxying av denne bønnen og sikre at den kan injiseres i en hvilken som helst annen bønne, selv med et bredere omfang. TARGET_CLASS modus tillater proxying ikke bare for grensesnitt, men også klasser.

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

8. @RequestAttribute og @SessionAttribute Kommentarer

To merknader til for å injisere parametere for HTTP-forespørselen i Kontroller metoder dukket opp, nemlig @RequestAttribute og @SessionAttribute. De lar deg få tilgang til noen eksisterende attributter, administrert globalt (dvs. utenfor Kontroller). Verdiene for disse attributtene kan for eksempel tilveiebringes av registrerte forekomster av javax.servlet.Filter eller org.springframework.web.servlet.HandlerInterceptor.

Anta at vi har registrert følgende HandlerInterceptor implementering som analyserer forespørselen og legger til Logg Inn parameter til økten og en annen spørsmål parameter til en forespørsel:

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

Slike parametere kan injiseres i en Kontroller forekomst med tilsvarende merknader om metodeargumenter:

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

9. Støtte for versjoner av biblioteker / applikasjonsservere

Våren 4.3 støtter følgende biblioteksversjoner og servergenerasjoner:

  • Dvalemodus ORM 5.2 (støtter fortsatt 4.2 / 4.3 og 5.0 / 5.1 også, med 3.6 utfaset nå)
  • Jackson 2.8 (minimum hevet til Jackson 2.6+ fra og med våren 4.3)
  • OkHttp 3.x (støtter fremdeles OkHttp 2.x side om side)
  • Netty 4.1
  • Undertow 1.4
  • Tomcat 8.5.2 samt 9.0 M6

Videre innebærer Spring 4.3 den oppdaterte ASM 5.1 og Objenesis 2.4 in spring-core.jar.

10. Injeksjonspunkt

De Injeksjonspunkt klasse er en ny klasse introdusert våren 4.3 som gir informasjon om steder der en bestemt bønne blir injisert, enten det er en metode / konstruktorparameter eller et felt.

Type informasjon du kan finne ved hjelp av denne klassen er:

  • Felt objekt - du kan få injeksjonspunktet pakket inn som en Felt objektet ved å bruke getField () metode hvis bønnen injiseres i et felt
  • Metode Parameter - du kan ringe getMethodParameter () metode for å oppnå injeksjonspunktet pakket inn som en Metode Parameter objekt hvis bønnen injiseres i en parameter
  • Medlem - ringer getMember () metoden vil returnere enheten som inneholder den injiserte bønnen pakket inn i en Medlem gjenstand
  • Klasse - få den deklarerte typen av parameteren eller feltet der bønnen injiseres, ved hjelp av getDeclaredType ()
  • Kommentar [] - ved å bruke getAnnotations () metode, kan du hente en matrise med merknadsobjekter som representerer merknadene tilknyttet feltet eller parameteren
  • AnnotatedElement - anrop getAnnotatedElement () for å få injeksjonspunktet pakket som et AnnotatedElement gjenstand

Et tilfelle der denne klassen er veldig nyttig, er når vi vil lage Logger bønner basert på klassen de tilhører:

@Bean @Scope ("prototype") offentlig loggerlogger (InjectionPoint injectionPoint) {retur Logger.getLogger (injectionPoint.getMethodParameter (). GetContainingClass ()); }

Bønnen må defineres med en prototype omfang slik at det opprettes en annen logger for hver klasse. Hvis du oppretter en singleton og injiser flere steder, vil våren returnere det første injeksjonspunktet.

Deretter kan vi injisere bønnen i vår AvtalerKontroller:

@Autowired privat loggerlogger;

11. Konklusjon

I denne artikkelen diskuterte vi noen av de nye funksjonene som ble introdusert med Spring 4.3.

Vi har dekket nyttige kommentarer som eliminerer kjeleplaten, nye nyttige metoder for avhengighetssøk og injeksjon og flere betydelige forbedringer innen nett- og caching-fasiliteter.

Du finner kildekoden for artikkelen på GitHub.


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