annotation based factory methods

后端 未结 5 425
無奈伤痛
無奈伤痛 2020-12-11 15:24

I want to be able to autowire a singleton bean (foo)

@Component
public class FooUser {

  @Autowire Foo foo;
}

created by ano

5条回答
  •  没有蜡笔的小新
    2020-12-11 16:13

    Spring Boot: factory method

    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    
    enum ParsersConst {
        bofa, jpm, wellsforgo
    }
    
    interface Parser {
        String readFromFile(String file);
    }
    
    class JPM implements Parser {
        @Override
        public String readFromFile(String file) {
            System.out.println("From JPM Parser");
            //LOGIC to read file data
            return "JPM";
        }
    }
    
    class Bofa implements Parser {
        @Override
        public String readFromFile(String file) {
            System.out.println("From Bofa Parser");
            //LOGIC to read file data
            return "BOFA";
        }
    }
    
    class WellsForgo implements Parser {
        @Override
        public String readFromFile(String file) {
            System.out.println("From Wellsforgo Parser"); 
            //LOGIC to read file data
            return "WellsForgo";
        }
    }
    
    class ParserCreator {
        private Map parserMap;
    
        public Parser createParser(ParsersConst parsConst) {
            Parser parser = parserMap.get(parsConst);
            if (parserMap.get(parsConst) != null) {
                return parser;
            }
            throw new IllegalArgumentException("Unknown Parser");
        }
    
        public void setParserMap(Map parserMap) {
            this.parserMap = parserMap;
        }
    }
    
    @Configuration
    class ParserConfig {
    
        @Bean
        public ParserCreator parserCreatorFactory() {
            ParserCreator factory = new ParserCreator();
            Map map = new HashMap();
            map.put(ParsersConst.bofa, new Bofa());
            map.put(ParsersConst.wellsforgo, new WellsForgo());
            map.put(ParsersConst.jpm, new JPM());
            factory.setParserMap(map);
            return factory;
    
        }
    
        @Bean
        public Parser bofa() {
            return parserCreatorFactory().createParser(ParsersConst.bofa);
        }
    
        @Bean
        public Parser wellsforgo() {
            return parserCreatorFactory().createParser(ParsersConst.wellsforgo);
        }
    
        @Bean
        public Parser jpm() {
            return parserCreatorFactory().createParser(ParsersConst.jpm);
        }
    }
    
    @Component
    public class StaticFacotryDemo implements CommandLineRunner {
        @Autowired
        private ApplicationContext context;
    
        @Override
        public void run(String... args) throws Exception {
    
            Parser parser = (Parser) context.getBean(ParsersConst.jpm.toString());
            System.out.println(parser.readFromFile("jan_stmt.pdf"));
    
        }
    
    }
    

提交回复
热议问题