プロジェクトにファクトリパターンを実装したいのですが、オンラインリソースを調べたところ、通常のJavaファクトリパターンではなく、ServiceLocatorFactoryBeanを実装する必要があることがわかりました。
私は this リンクをたどりましたが、xmlベースで説明されています...アノテーションベースのファクトリパターンを使用してそれを行う方法を誰かに教えてもらえますか?
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);
}
}
_