2015-11-30 17 views
6

注釈ベースのServiceLocatorFactoryBean?

私はthisリンクをたどってきた....私は私のproject..iは、オンラインリソースを経てきた中でFactoryパターンを実装したいと私は春のServiceLocatorFactoryBeanではなく、通常のJavaのファクトリパターンを実装する必要があります知っているようになりましたしかしそれはxmlベースで説明されています....どのように注釈ベースのファクトリパターンを使用してそれを行う方法を教えてくれますか?上記のインタフェースのための

答えて

16

春のJavaの設定REFガイド@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; 
    } 
} 

ビジネスロジックはimplemeted ParseService.javaを、パース指定する列挙。

@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私の豆のすべてのコンテナ管理Beanとして登録春の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(); 
} 
} 

次にコントローラまたはテストclasssいずれかでParserService Beanをautowire、およびテストする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はありません:この依存性のためのautowire候補となる少なくとも1つのbeanが必要です。依存関係の注釈:{@ org.springframework.beans.factory.annotation.Autowired(必須= true)} ' – kumar

+0

@Autowired注釈をParserFactoryに削除すると、上記の例外は発生しませんが、NullPointerExceptionが発生します。 – kumar

関連する問題