Наконец, я сделал это, как показано ниже, теперь я уверен, что это лучший способ. Я не хотел иметь три реализации только из-за одной переменной.
application.yaml
blockquote>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
MainApplication.java
blockquote>@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
blockquote>@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(); } }
TypeTwoRoute.java
blockquote>@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(); } }
TransactionManager.java
blockquote>@Service @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) public interface TransactionManager { public ZonedDateTime create() throws IOException, ParseException; }
TransactionManagerImpl.java
blockquote>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 будет зарегистрирован в
app.default.txn-info.csv
, и когда я получу его изApplicationContext
, я заменяю значение переданным параметром чтобы получить бин изApplicationContext
B::rofl(int)
«скрывает» A::rofl()
. Чтобы иметь A
перегрузки rofl
, вы должны объявить B
как using A::rofl;
.
class B : public A {
public:
using A::rofl;
...
};
Это мудрый шаг в C ++: он предупреждает вас о том, что вам, вероятно, также необходимо переопределить метод A::rofl()
в B
. Либо вы делаете это, либо вы явно заявляете, что используете другие перегрузки A
.