java 基于注解的 ServiceLocatorFactoryBean?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33993063/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Annotation based ServiceLocatorFactoryBean?
提问by kumar
I would like to implement Factory pattern in my project..i have gone through online resources and I came to know that spring ServiceLocatorFactoryBean should be implemented instead of normal java factory pattern....
我想在我的项目中实现工厂模式..我已经浏览了在线资源,我开始知道应该实现 spring ServiceLocatorFactoryBean 而不是普通的 java 工厂模式......
i have followed thislink but it is explained in xml based....can any one tell me how to do it using annotations based Factory pattern??
我已经关注了这个链接,但它是在基于 xml 的解释....谁能告诉我如何使用基于注释的工厂模式来做到这一点?
回答by Lovababu
Spring Java Configuration ref guide @Configuration
Spring Java 配置参考指南@Configuration
Interface Parser.class
接口解析器.class
public interface Parser {
void parse(String str);
}
Implementation for above interface.
上述接口的实现。
JsonParser.java
JsonParser.java
public class JsonParser implements Parser {
@Override
public void parse(String str) {
System.out.println("JsonParser.parse::" + str);
}
}
XMLParser.java
XML解析器
public class XMLParser implements Parser{
@Override
public void parse(String str) {
System.out.println("XMLParser.parse :: " + str);
}
}
ParserFactory.javaactual Factory interface.
ParserFactory.java实际的工厂接口。
public interface ParserFactory {
public Parser getParser(ParserType parserType);
}
ParseType.javaenum to specify parsing types(avoid typos and safe)
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, where Business logic 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);
}
}
Finally AppConfig.javaSpring java configuration class, where all of my beans registered as container managed beans.
最后是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();
}
}
Now autowire ParserService
bean in either controller or test classs, and invoke parese(String, ParseType)
method to test.
现在ParserService
在控制器或测试类中自动装配bean,并调用parese(String, ParseType)
方法进行测试。
Here is my test.
这是我的测试。
@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);
}
}