Stvaranje proljetnog graha tvorničkim metodama

1. Uvod

Tvorničke metode mogu biti korisna tehnika za skrivanje složene logike stvaranja unutar jednog poziva metode.

Iako u proljeće obično stvaramo grah koristeći konstruktor ili ubrizgavanje polja, možemo stvoriti i proljetni grah tvorničkim metodama.

U ovom ćemo se tutorialu pozabaviti stvaranjem Spring graha koristeći i instance i statičke tvorničke metode.

2. Metoda tvorničke instance

Standardna implementacija uzorka tvorničke metode je stvaranje metode instance koja vraća željeni grah.

Dodatno, možemo konfigurirati Spring da stvori željeni grah sa ili bez argumenata.

2.1. Bez argumenata

Možemo stvoriti Foo klasa koja predstavlja naš grah koji nastaje:

javni razred Foo {}

Zatim kreiramo InstanceFooFactory klasa koja uključuje tvorničku metodu, createInstance, koja stvara našu Foo grah:

javna klasa InstanceFooFactory {public Foo createInstance () {return new Foo (); }}

Nakon toga konfiguriramo Spring:

  1. Stvorite grah za našu tvorničku klasu (InstanceFooFactory)
  2. Koristiti tvornica-grah atribut za referencu naše tvorničke grah
  3. Koristiti tvornička metoda atribut koji upućuje na našu tvorničku metodu (createInstance)

Primjenjujući ovo na Spring XML konfiguraciju, na kraju imamo:

Na kraju, automatski povezujemo svoje željeno Foo grah. Proljeće će tada stvoriti naš grah koristeći naš createInstance tvornička metoda:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ("/ factorymethod / instance-config.xml") javna klasa InstanceFooFactoryIntegrationTest {@Autowired private Foo foo; @Test javna praznina givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull () {assertNotNull (foo); }}

2.2. S argumentima

Također možemo pružiti argumente za našu tvorničku metodu instance koristeći konstruktor-arg element u našoj proljetnoj konfiguraciji.

Prvo, kreiramo razred, Bar, koji koristi argument:

javna klasa Bar {naziv privatnog niza; javna traka (naziv niza) {this.name = name; } // ... getteri i postavljači}

Dalje, kreiramo tvorničku klasu instance, InstanceBarFactory, s tvorničkom metodom koja prihvaća argument i vraća a Bar grah:

javna klasa InstanceBarFactory {javna traka createInstance (naziv niza) {return new Bar (name); }}

Na kraju dodajemo a konstruktor-arg element našeg Bar definicija graha:

Tada možemo automatski spojiti naš Bar grah na isti način kao i mi za naš Foo grah:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ("/ factorymethod / instance-bar-config.xml") javna klasa InstanceBarFactoryIntegrationTest {@Autowired private Bar instance; @Test javna praznina givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect () {assertNotNull (instanca); assertEquals ("someName", instance.getName ()); }}

3. Statička tvornička metoda

Također možemo konfigurirati Spring da koristi statičku metodu kao tvorničku metodu.

Iako bi trebale biti preferirane tvorničke metode, ova tehnika može biti korisna ako imamo postojeće, naslijeđene statičke metode koje proizvode željeni grah. Na primjer, ako tvornička metoda vrati singleton, možemo konfigurirati Spring da koristi ovu singleton tvorničku metodu.

Slično tvorničkim metodama instance, mi možemo konfigurirati statičke metode sa i bez argumenata.

3.1. Bez argumenata

Koristeći naš Foo razred kao naš željeni grah, možemo stvoriti razred, SingletonFooFactory, što uključuje a createInstance tvornička metoda koja vraća pojedinačnu instancu Foo:

javna klasa SingletonFooFactory {private static final Foo INSTANCE = new Foo (); javni statični Foo createInstance () {return INSTANCE; }}

Ovaj put, trebamo stvoriti samo jedan grah. Ovaj grah zahtijeva samo dva atributa:

  1. razred - izjavljuje našu tvorničku klasu (SingletonFooFactory)
  2. tvornička metoda - izjavljuje statičku tvorničku metodu (createInstance)

Primjenjujući ovo na našu Spring XML konfiguraciju, dobivamo:

Na kraju, automatski povezujemo svoje Foo grah koji koristi istu strukturu kao i prije:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ("/ factorymethod / static-foo-config.xml") javna klasa SingletonFooFactoryIntegrationTest {@Autowired private Foo singleton; @Test javna praznina givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull () {assertNotNull (singleton); }}

3.2. S argumentima

Dok trebali bismo izbjegavati mijenjati stanje statičnih objekata - poput našeg jednoboja - kad je to moguće, još uvijek možemo prosljeđivati ​​argumente našoj statičkoj tvorničkoj metodi.

Da bismo to učinili, kreiramo novu tvorničku metodu koja prihvaća naše željene argumente:

javna klasa SingletonBarFactory {privatna statička konačna traka INSTANCE = nova traka ("neimenovana"); javna statička traka createInstance (naziv niza) {INSTANCE.setName (name); povratak INSTANCIJA; }}

Nakon toga konfiguriramo Spring da preda željeni argument pomoću konstruktor-arg element:

Na kraju, automatski povezujemo svoje Bar grah koji koristi istu strukturu kao i prije:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ("/ factorymethod / static-bar-config.xml") javna klasa SingletonBarFactoryIntegrationTest {@Autowired private Bar instance; @Test javna praznina givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect () {assertNotNull (instanca); assertEquals ("someName", instance.getName ()); }}

4. Zaključak

U ovom smo članku pogledali kako konfigurirati Spring da koristi instance i statičke tvorničke metode - i sa i bez argumenata.

Iako je stvaranje graha konstrukcijskim i poljskim ubrizgavanjem uobičajenije, tvorničke metode mogu biti korisne za složene korake izrade i naslijeđeni kôd.

Kôd korišten u ovom članku možete pronaći na GitHubu.