web-dev-qa-db-ja.com

アノテーションベースのServiceLocatorFactoryBean?

プロジェクトにファクトリパターンを実装したいのですが、オンラインリソースを調べたところ、通常のJavaファクトリパターンではなく、ServiceLocatorFactoryBeanを実装する必要があることがわかりました。

私は this リンクをたどりましたが、xmlベースで説明されています...アノテーションベースのファクトリパターンを使用してそれを行う方法を誰かに教えてもらえますか?

15
kumar

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実際のFactoryインターフェース。

_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、ビジネスロジックが実装されています。

_@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.JavaSpring Java構成クラス、すべてのBeanがコンテナ管理Beanとして登録されています。

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