我想在我的项目中实现Factory模式。我已经浏览了在线资源,并且我知道应该实现Spring ServiceLocatorFactoryBean而不是普通的java工厂模式....
我已经关注了this链接,但它是基于xml的解释....任何人都可以告诉我如何使用基于工厂模式的注释来做到这一点?
答案 0 :(得分:27)
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 实际的工厂界面。
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.java Spring 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,并调用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);
}
}
答案 1 :(得分:1)
看这个完整的例子:Serevice Locator factory
它可以帮助我了解使用Spring Boot的工作原理。