Hvordan bruke Spring FactoryBean?

1. Oversikt

Det er to slags bønner i vårbønnebeholderen: vanlige bønner og fabrikkbønner. Våren bruker førstnevnte direkte, mens sistnevnte kan produsere objekter selv, som styres av rammeverket.

Og enkelt sagt, vi kan bygge en fabrikkbønne ved å implementere den org.springframework.beans.factory.FactoryBean grensesnitt.

2. Grunnleggende om fabrikkbønner

2.1. Implementere a FactoryBean

La oss se på FactoryBean grensesnitt først:

offentlig grensesnitt FactoryBean {T getObject () kaster Unntak; Klasse getObjectType (); boolsk isSingleton (); }

La oss diskutere de tre metodene:

  • getObject () - returnerer et objekt produsert av fabrikken, og dette er objektet som skal brukes av Spring container
  • getObjectType () - returnerer typen objekt som dette FactoryBean produserer
  • isSingleton () - betegner om objektet produsert av dette FactoryBean er en singleton

La oss nå implementere et eksempel FactoryBean. Vi implementerer en ToolFactory som produserer gjenstander av typen Verktøy:

public class Tool {private int id; // standardkonstruktører, getters og settere}

De ToolFactory seg selv:

offentlig klasse ToolFactory implementerer FactoryBean {private int factoryId; private int toolId; @Override public Tool getObject () kaster unntak {returner nytt verktøy (toolId); } @Override public Class getObjectType () {return Tool.class; } @Override public boolean isSingleton () {return false; } // standard settere og getters}

Som vi kan se, er ToolFactory er en FactoryBean, som kan produsere Verktøy gjenstander.

2.2. Bruk FactoryBean Med XML-basert konfigurasjon

La oss nå ta en titt på hvordan vi bruker vår ToolFactory.

Vi begynner å konstruere et verktøy med XML-basert konfigurasjon - factorybean-spring-ctx.xml:

Deretter kan vi teste om Verktøy objektet injiseres riktig:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-spring-ctx.xml"}) offentlig klasse FactoryBeanXmlConfigTest {@Autowired private Tool tool; @Test offentlig ugyldig testConstructWorkerByXml () {assertThat (tool.getId (), equalTo (1)); }}

Testresultatet viser at vi klarer å injisere verktøyobjektet produsert av ToolFactory med egenskapene vi konfigurerte i factorybean-spring-ctx.xml.

Testresultatet viser også at Spring container bruker objektet produsert av FactoryBean i stedet for seg selv for avhengighetsinjeksjon.

Selv om Spring container bruker FactoryBean‘S getObject () Metodens returverdi som bønne, kan du også bruke FactoryBean seg selv.

For å få tilgang til FactoryBean, du trenger bare å legge til et "&" foran bønnenavnet.

La oss prøve å få fabrikkbønnen og dens fabrikkId eiendom:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-spring-ctx.xml"}) offentlig klasse FactoryBeanXmlConfigTest {@Resource (name = "& tool") private ToolFactory toolFactory; @Test offentlig ugyldig testConstructWorkerByXml () {assertThat (toolFactory.getFactoryId (), equalTo (9090)); }}

2.3. Bruk FactoryBean Med Java-basert konfigurasjon

Bruk FactoryBean med Java-basert konfigurasjon er litt annerledes med XML-basert konfigurasjon, må du ringe FactoryBean‘S getObject () metoden eksplisitt.

La oss konvertere eksemplet i forrige del til et Java-basert konfigurasjonseksempel:

@Configuration offentlig klasse FactoryBeanAppConfig {@Bean (name = "tool") offentlig ToolFactory toolFactory () {ToolFactory fabrikk = ny ToolFactory (); factory.setFactoryId (7070); factory.setToolId (2); tilbake fabrikken; } @Bean public Tool tool () kaster unntak {return toolFactory (). GetObject (); }}

Så tester vi om Verktøy objektet injiseres riktig:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (klasser = FactoryBeanAppConfig.class) offentlig klasse FactoryBeanJavaConfigTest {@Autowired private Tool tool; @Resource (name = "& tool") private ToolFactory toolFactory; @Test offentlig ugyldig testConstructWorkerByJava () {assertThat (tool.getId (), equalTo (2)); assertThat (toolFactory.getFactoryId (), equalTo (7070)); }}

Testresultatet viser den samme effekten som den forrige XML-baserte konfigurasjonstesten.

3. Måter å initialisere på

Noen ganger må du utføre noen operasjoner etter FactoryBean er satt, men før getObject () metoden kalles, som egenskaper sjekk.

Du kan oppnå dette ved å implementere InitialisererBønne grensesnitt eller bruk @PostConstruct kommentar.

Flere detaljer om bruk av disse to løsningene er introdusert i en annen artikkel: Guide To Running Logic on Startup in Spring.

4. AbstraktFabrikkBønne

Våren gir AbstraktFabrikkBønne som en enkel mal superklasse for FactoryBean implementeringer. Med denne basisklassen kan vi nå mer praktisk implementere en fabrikkbønne som skaper en singleton eller et prototypeobjekt.

La oss implementere en SingleToolFactory og en NonSingleToolFactory for å vise hvordan du bruker AbstraktFabrikkBønne for både singleton og prototypetype:

offentlig klasse SingleToolFactory utvider AbstractFactoryBean {private int factoryId; private int toolId; @ Override public Class getObjectType () {return Tool.class; } @ Override-beskyttet verktøy createInstance () kaster unntak {returner nytt verktøy (toolId); } // standard settere og getters}

Og nå implementeringen av nonsingleton:

offentlig klasse NonSingleToolFactory utvider AbstractFactoryBean {private int factoryId; private int toolId; offentlig NonSingleToolFactory () {setSingleton (false); } @Override public Class getObjectType () {return Tool.class; } @ Override-beskyttet verktøy createInstance () kaster unntak {returner nytt verktøy (toolId); } // standard settere og getters}

XML-konfigurasjonen for disse fabrikkbønnene:

Nå kan vi teste om Arbeider objektenes egenskaper injiseres slik vi forventer:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: factorybean-abstract-spring-ctx.xml"}) offentlig klasse AbstractFactoryBeanTest {@Resource (name = "singleTool") privat verktøyverktøy1; @Resource (name = "singleTool") privat verktøyverktøy2; @Resource (name = "nonSingleTool") privat verktøyverktøy3; @Resource (name = "nonSingleTool") privat verktøy Tool4; @Test offentlig ugyldig testSingleToolFactory () {assertThat (tool1.getId (), equalTo (1)); assertTrue (tool1 == tool2); } @Test offentlig ugyldig testNonSingleToolFactory () {assertThat (tool3.getId (), equalTo (2)); assertThat (tool4.getId (), equalTo (2)); assertTrue (tool3! = tool4); }}

Som vi kan se av testene, har SingleToolFactory produserer singleton objekt, og NonSingleToolFactory produserer prototype objekt.

Merk at det ikke er behov for å angi singleton-egenskap i SingleToolFactory fordi, i AbstraktFabrikk, standardverdien for singleton-egenskapen er ekte.

5. Konklusjon

Bruker en FactoryBean kan være en god praksis å innkapsle kompleks konstruksjonslogikk eller gjøre konfigurering av svært konfigurerbare objekter enklere om våren.

Så i denne artikkelen introduserte vi det grunnleggende om hvordan du implementerer FactoryBean, hvordan du bruker den i både XML-basert konfigurasjon og Java-basert konfigurasjon, og noen andre diverse aspekter av FactoryBean, for eksempel initialisering av FactoryBean og AbstraktFabrikkBønne.

Som alltid er hele kilden over på GitHub.


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