基于注释的ServiceLocatorFactoryBean?

时间:2015-11-30 07:02:02

标签: java spring spring-mvc annotations factory-pattern

我想在我的项目中实现Factory模式。我已经浏览了在线资源,并且我知道应该实现Spring ServiceLocatorFactoryBean而不是普通的java工厂模式....

我已经关注了this链接,但它是基于xml的解释....任何人都可以告诉我如何使用基于工厂模式的注释来做到这一点?

2 个答案:

答案 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的工作原理。