Spring Boot i Togglz Aspect

1. Pregled

U ovom uputstvu ćemo pogledati kako Togglz knjižnica se može koristiti s aplikacijom Spring Boot.

2. Togglz

The Togglz knjižnica omogućuje provedbu Prekidači za značajke uzorak dizajna. Ovaj se obrazac odnosi na postojanje mehanizma koji omogućuje određivanje tijekom izvođenja aplikacije je li neka značajka omogućena ili ne na temelju preklopke.

Onemogućavanje značajke tijekom izvođenja može biti korisno u raznim situacijama, poput rada na novoj značajci koja još nije dovršena, želeći omogućiti pristup značajci samo podskupini korisnika ili pokretanje A / B testiranja.

U sljedećim odjeljcima stvorit ćemo aspekt koji presreće metode s napomenom koja daje naziv značajke i odrediti hoćemo li nastaviti s izvršavanjem metoda ovisno o tome je li značajka omogućena ili ne.

3. Ovisnosti Mavena

Uz ovisnosti Spring Boot-a, i Togglz knjižnica nudi Spring Boot Starter teglu:

 org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE org.togglz togglz-spring-boot-starter 2.4.1 org.togglz togglz-spring-security 2.4.1 org.springframework.boot spring-boot- starter-web org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-test com.h2database h2 1.4.194 

Najnovije verzije togglz-spring-boot-starter, togglz-spring-security, spring-boot-starter-web, spring-boot-starter-data-jpa, spring-boot-starter-test, h2 mogu se preuzeti s Mavena Središnji.

4. Togglz konfiguracija

The togglz-spring-boot-starter knjižnica sadrži automatsku konfiguraciju za stvaranje potrebnih grahova kao što je FeatureManager. Jedini grah koji moramo osigurati je featureProvider grah.

Prvo, kreirajmo nabrajanje koje implementira Značajka sučelje i sadrži popis naziva značajki:

javni popis MyFeatures implementira značajku {@Label ("Značajka upravljanja zaposlenicima") EMPLOYEE_MANAGEMENT_FEATURE; javna logička vrijednost isActive () {return FeatureContext.getFeatureManager (). isActive (this); }}

Popisivanje također definira metodu koja se naziva isActive () koji provjerava je li određena značajka omogućena.

Tada možemo definirati grah tipa EnumBasedFeatureProvider u klasi konfiguracije Spring Boot:

@Configuration javna klasa ToggleConfiguration {@Bean public FeatureProvider featureProvider () {return new EnumBasedFeatureProvider (MyFeatures.class); }}

5. Stvaranje aspekta

Zatim ćemo stvoriti aspekt koji presreće običaj AssociatedFeature bilješka i provjerava značajku koja je navedena u parametru bilješke kako bi se utvrdilo je li aktivna ili ne:

@Aspect @Component javna klasa FeaturesAspect {private static final Logger LOG = Logger.getLogger (FeaturesAspect.class); @Around ("@within (featureAssociation) || @annotation (featureAssociation)") javni objekt checkAspect (ProceedingJoinPoint joinPoint, FeatureAssociation featureAssociation) baca mogućnost bacanja {if (featureAssociation.value (). IsActive ()) {return joinPoint.proceed ; } else {LOG.info ("Feature" + featureAssociation.value (). name () + "nije omogućeno!"); return null; }}}

Definirajmo i prilagođenu napomenu tzv FeatureAssociation koji će imati vrijednost() parametar tipa MyFeatures nabrajanje:

@Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.METHOD, ElementType.TYPE}) public @interface FeatureAssociation {MyFeatures value (); }

Ako je značajka aktivna, aspekt će nastaviti izvršavanje metode; ako ne, zapisat će poruku bez pokretanja koda metode.

6. Aktivacija značajke

Značajka u Togglz mogu biti aktivni ili neaktivni. Takvim ponašanjem upravlja omogućeno zastavicu i po želji strategiju aktivacije.

Za postavljanje omogućeno zastava na true, možemo koristiti @EnabledByDefault napomena o definiciji vrijednosti nabrajanja.

Togglz knjižnica također nudi razne strategije aktivacije koje se mogu koristiti za utvrđivanje je li značajka omogućena na temelju određenog stanja.

U našem primjeru upotrijebimo SystemPropertyActivationStrategy za našu EMPLOYEE_MANAGEMENT_FEATURE koja procjenjuje stanje značajke na temelju vrijednosti svojstva sustava. Potrebno ime i vrijednost svojstva mogu se odrediti pomoću @ActivationParameter napomena:

javno enum MyFeatures provodi Igrani {@Label ( "Upravljanje zaposlenika Igrani") @EnabledByDefault @DefaultActivationStrategy (id = SystemPropertyActivationStrategy.ID, parametri = {@ActivationParameter (ime = SystemPropertyActivationStrategy.PARAM_PROPERTY_NAME, vrijednost = "employee.feature"), @ActivationParameter ( name = SystemPropertyActivationStrategy.PARAM_PROPERTY_VALUE, value = "true")}) EMPLOYEE_MANAGEMENT_FEATURE; // ...}

Postavili smo da naša značajka bude omogućena samo ako zaposlenik.obilježje svojstvo ima vrijednost pravi.

Ostale vrste aktivacijskih strategija koje pruža Togglz knjižnica su:

  • UsernameActivationStrategy - omogućuje značajku da bude aktivna za navedeni popis korisnika
  • UserRoleActivationStrategy - uloga trenutnog korisnika koristi se za određivanje stanja značajke
  • ReleaseDateActivationStrategy - automatski aktivira značajku u određeni datum i vrijeme
  • Strategija postupne aktivacije - omogućuje značajku za određeni postotak korisnika
  • ScriptEngineActivationStrategy - omogućuje upotrebu prilagođene skripte napisane na jeziku koji podržava ScriptEngine JVM-a kako bi se utvrdilo je li značajka aktivna ili ne
  • Strategija ServerIpActivationStrategy - značajka je omogućena na temelju IP adresa poslužitelja

7. Testiranje aspekta

7.1. Primjer prijave

Da bismo vidjeli naš aspekt na djelu, stvorimo jednostavan primjer koji sadrži značajku za upravljanje zaposlenicima organizacije.

Kako će se ova značajka razvijati, možemo dodavati metode i klase označene našim @AssociatedFeature napomena s vrijednošću EMPLOYEE_MANAGEMENT_FEATURE. To osigurava da će im biti dostupne samo ako je značajka aktivna.

Prvo, definirajmo Zaposlenik klasa entiteta i spremište na temelju Spring podataka:

@ Entity public class zaposlenik {@Id private long id; privatna dvostruka plaća; // standardni konstruktor, getteri, postavljači}
javno sučelje EmployeeRepository proširuje CrudRepository {}

Dalje, dodajte an Usluga zaposlenika s metodom za povećanje plaće zaposlenika. Mi ćemo dodati @AssociatedFeature anotacija metode s parametrom od EMPLOYEE_MANAGEMENT_FEATURE:

@Service javna klasa SalaryService {@Autowired EmployeeRepository workerRepository; @FeatureAssociation (value = MyFeatures.EMPLOYEE_MANAGEMENT_FEATURE) javna praznina povećanjeSalary (long id) {Employee worker = workerRepository.findById (id) .orElse (null); worker.setSalary (zaposlenik.getSalary () + zaposlenik.getSalary () * 0,1); workerRepository.save (zaposlenik); }} 

Metoda će biti pozvana iz / povećatiplatu krajnja točka koju ćemo pozvati na testiranje:

@Controller javna klasa SalaryController {@Autowired SalaryService payService; @PostMapping ("/ увеличениеSalary") @ResponseBody javna praznina povećatiSalary (@RequestParam long id) {payService.increaseSalary (id); }}

7.2. JUnit test

Prvo, dodajmo test u kojem nazivamo naše POST mapiranje nakon postavljanja zaposlenik.obilježje svojstvo da lažno. U ovom slučaju, značajka ne bi trebala biti aktivna i vrijednost plaće zaposlenika ne bi se trebala mijenjati:

@Test public void givenFeaturePropertyFalse_whenIncreaseSalary_thenNoIncrease () baca izuzetak {Employee emp = new Employee (1, 2000); workerRepository.save (emp); System.setProperty ("worker.feature", "false"); mockMvc.perform (post ("/ povećanjeSalary") .param ("id", emp.getId () + "")) .andExpect (status (). je (200)); emp = workerRepository.findOne (1L); assertEquals ("netočna plaća", 2000, emp.getSalary (), 0,5); }

Dalje, dodajmo test u kojem izvodimo poziv nakon postavljanja svojstva na pravi. U tom slučaju treba povećati vrijednost plaće:

@Test public void givenFeaturePropertyTrue_whenIncreaseSalary_thenIncrease () baca iznimku {Employee emp = new Employee (1, 2000); workerRepository.save (emp); System.setProperty ("worker.feature", "true"); mockMvc.perform (post ("/ povećanjeSalary") .param ("id", emp.getId () + "")) .andExpect (status (). je (200)); emp = workerRepository.findById (1L) .orElse (null); assertEquals ("netočna plaća", 2200, emp.getSalary (), 0,5); }

8. Zaključci

U ovom uputstvu pokazali smo kako se možemo integrirati Togglz knjižnica s Spring Bootom pomoću aspekta.

Puni izvorni kod primjera može se naći na GitHubu.


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