2015-11-30 19 views
6

Ek açıklamalı ServiceLocatorFactoryBean?

i this linki takip ettim .... ben project..i çevrimiçi kaynakları ile gitti Fabrika deseni uygulamak istiyorum ve bu bahar ServiceLocatorFactoryBean yerine normal bir java fabrika deseni uygulanmalıdır bilmek geldi ama xml tabanlı olarak açıklanmıştır .... herhangi biri bana nasıl ek açıklamaları tabanlı Fabrika kalıbı kullanarak nasıl yapılacağını söyleyebilir? Yukarıdaki arayüzü için

cevap

16

Bahar Java Yapılandırma ref kılavuzu @Configuration

Arayüz Parser.class

public interface Parser { 
    void parse(String str); 
} 

Uygulama.

JsonParser.java

public class JsonParser implements Parser { 
    @Override 
    public void parse(String str) { 
    System.out.println("JsonParser.parse::" + str); 
    } 
} 

XMLParser.java

public class XMLParser implements Parser{ 

    @Override 
    public void parse(String str) { 
    System.out.println("XMLParser.parse :: " + str); 
    } 
} 

ParserFactory.java gerçek Fabrika arabirimi.

public interface ParserFactory { 
    public Parser getParser(ParserType parserType); 
} 

ParseType.java enum ayrıştırma tiplerini (kaçınmak yazım hatalarını ve güvenli)

public enum ParserType { 

JSON("jsonParser"), XML("xmlParser"); 

private final String value; 

    ParserType(String input) { 
    this.value = input; 
    } 

    public String getValue() { 
    return this.value; 
    } 

    @Override 
    public String toString() { 
    return this.value; 
    } 
} 

İş mantığı implemeted ParseService.java belirtmek için.

@Service 
public class ParserService { 

@Autowired 
private ParserFactory parserFactory; 

public void doParse(String parseString, ParserType parseType) { 
    Parser parser = parserFactory.getParser(parseType); 
    System.out.println("ParserService.doParse.." + parser); 
    parser.parse(parseString); 
} 
} 

Nihayet AppConfig.java benim fasulye tüm konteyner yönetilen fasulye olarak tescil Bahar java yapılandırma sınıfı.

@Configuration 
@ComponentScan(basePackages = {"<Your Package Name>"}) 
public class AppConfig { 
@Bean 
public FactoryBean serviceLocatorFactoryBean() { 
    ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean(); 
    factoryBean.setServiceLocatorInterface(ParserFactory.class); 
    return factoryBean; 
} 

@Bean(name = "jsonParser") 
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
public JsonParser jsonParser() { 
    return new JsonParser(); 
} 

@Bean(name = "xmlParser") 
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
public XMLParser xmlParser() { 
    return new XMLParser(); 
} 
} 

Şimdi kontrol ya da test çerçevesinde en birinde ParserService fasulye autowire ve test etmek için parese(String, ParseType) yöntem ileri sürmektedir.

İşte benim testim.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = AppConfig.class) 
public class ServiceLocatorFactoryExample { 


@Autowired 
private ParserService parserService; 

@Test 
public void testParserFactory() { 
    parserService.doParse("Srilekha", ParserType.JSON); 
    parserService.doParse("Srilekha", ParserType.XML); 
} 
} 
+0

Çok teşekkürler @Lovababu. İşe yarıyor. Benim günümü yaptın. – kumar

+0

Sizin verdiğiniz örnekle denedim ancak ParserFactory satırında ParseService.java dosyasında otomatik bağlantı hatası alıyorum. 'nested exception org.springframework.beans.factory.NoSuchBeanDefinitionException: Bağımlılık için türden hiçbir nitelikli fasulye yok: Bu bağımlılık için otomatik bağlantı adayı olarak nitelendirilen en az 1 tane fasulye bekleniyor. Bağımlılık ek açıklamaları: {@ org.springframework.beans.factory.annotation.Outowired (required = true)} ' – kumar

+0

@Outowired açıklamayı ParserFactory'ye kaldırırsam yukarıdaki istisnayı alamıyorum ancak NullPointerException alıyorum. – kumar

İlgili konular