2015-11-30 60 views
6

我想實現工廠模式在我project..i已通過網上資源走了,我才知道,春天ServiceLocatorFactoryBean應該實現的,而不是普通的Java工廠模式....基於註釋的ServiceLocatorFactoryBean?

我按照this鏈接但它是在基於XML的解釋....可以任何人告訴我如何使用基於工廠模式的註釋?

回答

16

的Spring Java配置參考指南@Configuration

接口Parser.class

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

實現上面的接口。

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實際工廠接口。

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

ParseType.java枚舉指定解析類型(避免錯別字和安全)

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; 
    } 
} 

ParseService.java,其中商業邏輯Implemeted一個。

@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); 
} 
} 

最後AppConfig.java的Spring Java配置類,所有我的豆註冊爲容器管理豆。

@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(); 
} 
} 

現在,在任一控制器或測試類裏面自動裝配ParserService豆,並調用parese(String, ParseType)方法來測試。

這是我的測試。

@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

非常感謝@Lovababu。它正在工作。你讓我今天一整天都感覺很好。 – kumar

+0

我嘗試過使用您提供的示例,但在ParserFactory行的ParseService.java文件上出現autowiring錯誤。 '嵌套的異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有爲依賴關係找到的類型的合格bean:期望至少有1個bean有資格作爲這個依賴關係的autowire候選。依賴註釋:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}' – kumar

+0

如果我將@Autowired註釋移除到ParserFactory,那麼我沒有得到上述異常,但我得到NullPointerException。 – kumar