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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 22:23:12  来源:igfitidea点击:

Annotation based ServiceLocatorFactoryBean?

javaspringspring-mvcannotationsfactory-pattern

提问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 ParserServicebean 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);
 }
}