java - example - Basado en la anotación ServiceLocatorFactoryBean?
factory spring boot (1)
Me gustaría implementar el patrón Factory en mi proyecto. He pasado por recursos en línea y supe que se debe implementar SpringLocatorFactoryBean en lugar de un patrón normal de fábrica de Java.
He seguido este enlace pero está explicado en XML. ¿Puede alguien decirme cómo hacerlo usando anotaciones basadas en patrones de fábrica?
Guía de referencia de Spring Java Configuration @Configuration
Interfaz Parser.class
public interface Parser {
void parse(String str);
}
Implementación para la interfaz anterior.
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 Interfaz de fábrica real.
public interface ParserFactory {
public Parser getParser(ParserType parserType);
}
ParseType.java enum para especificar tipos de análisis (evitar errores tipográficos y seguros)
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 , donde se implementó la lógica empresarial.
@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);
}
}
Finalmente la clase de configuración AppConfig.java Spring java, donde todos mis beans se registraron como beans administrados por contenedor.
@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();
}
}
Ahora conecte ParserService
bean ParserService
en el controlador o las clases de prueba, e invoque el parese(String, ParseType)
para probar.
Aquí está mi prueba.
@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);
}
}