代码之家  ›  专栏  ›  技术社区  ›  Jigar Naik

具有字符串构造函数的Spring Boot-自动布线服务

  •  0
  • Jigar Naik  · 技术社区  · 7 年前

    我该怎么办 @autowire TransactionManagerImpl 它具有1(字符串)参数构造函数,而不使用 new 在spring boot应用程序中? autowire 不使用 新的

    自动装配 TransactionManager 在三个不同的类中,参数在所有三个类中都是不同的。

    这看起来很基本。

    @Service
    public class TransactionManagerImpl implements TransactionManager {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        String txnLogFile;
    
        @ConstructorProperties({"txnLogFile"})
        public TransactionManagerImpl(String txnLogFile) {
            this.txnLogFile= txnLogFile; 
        }
    
    }
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   Raghvendra Garg    7 年前

    您想在哪里使用@Service annotation有什么特殊要求吗?

    @Configuration
    public class Config {
    
    @Value("${txnLogFile}")
    private String txnLogFile;
    
    @Bean
    public TransactionManager transactionManager() {
        return new TransactionManagerImpl(txnLogFile);
     }
    
    }
    

    并从TransactionManagerImpl中删除@Service注释。

        2
  •  0
  •   Antoniossss    7 年前

    抛开其他的并发症不谈,可以这样做

    public TransactionManagerImpl(@Value("${txnLogFile}") String txnLogFile) {
        this.txnLogFile= txnLogFile; 
    }
    
        3
  •  0
  •   Jigar Naik    7 年前

    应用程序.yaml

    app:
       type-a:
          txn-log-file: data/type-a-txn-info.csv
       type-b:
          txn-log-file: data/type-b-txn-info.csv
       default: 
          txn-log-file: data/default/txn-info.csv
    

    主应用程序.java

    @SpringBootApplication
    public class MainApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(MainApplication.class).web(WebApplicationType.NONE).run(args);
        }
    
        @Bean
        public TransactionManager transactionManager(@Value("${app.default.txn-log-file}") String txnLogFile) {
            return new TransactionManagerImpl(txnLogFile);
        }
    
        @Bean
        public CsvService csvService(String txnLogFile) {
            return new CsvServiceImpl(txnLogFile);
        }
    }
    

    TypeOneRoute.java

    @Configuration
    public class TypeOneRoute extends RouteBuilder {
    
        @Value("${app.type-a.txn-log-file}")
        private String txnLogFile;
    
        @Autowired
        private ApplicationContext applicationContext;
    
        private TransactionManager transactionManager;
    
        @Override
        public void configure() throws Exception {
            transactionManager = applicationContext.getBean(TransactionManager.class, txnLogFile);
            transactionManager.someOperation();
    
        }
    }
    

    @Configuration
    public class TypeTwoRoute extends RouteBuilder {
    
        @Value("${app.type-b.txn-log-file}")
        private String txnLogFile;
    
        @Autowired
        private ApplicationContext applicationContext;
    
        private TransactionManager transactionManager;
    
        @Override
        public void configure() throws Exception {
            transactionManager = applicationContext.getBean(TransactionManager.class, txnLogFile);
            transactionManager.create();
    
        }
    }
    

    事务管理器.java

    @Service
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public interface TransactionManager {
    
        public ZonedDateTime create() throws IOException, ParseException;
    
    }
    

    事务管理器impl.java

    public class TransactionManagerImpl implements TransactionManager {
    
        @Autowired
        private ApplicationContext applicationContext;
    
        private String txnLogFile;
    
        public TransactionManagerImpl(String txnLogFile) {
            this.txnLogFile = txnLogFile;
        }
    
        private CsvService csvService;
    
        @PostConstruct
        public void init() {
            csvService = applicationContext.getBean(CsvService.class, txnLogFile);
        }
    
        public ZonedDateTime create() throws IOException, ParseException {
            try {
                csvService.createTxnInfoFile();
                return csvService.getLastSuccessfulTxnTimestamp();
            } catch (IOException e) {
                throw new IOException("Exception occured in getTxnStartDate()", e);
            }
        }
    
    }
    

    最初,TransactionManager Bean将注册到 app.default.txn-info.csv ApplicationContext 我用传递来获取bean的参数替换该值