Решение находится в ссылке, которую вы предоставили в своем вопросе:
datetime.combine(date.today(), time()) + timedelta(hours=1)
Полный пример:
from datetime import date, datetime, time, timedelta
dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()
Выход:
00:25:00
Есть ли какие-то особые требования, когда вы хотите использовать аннотацию @Service? если нет, то вы можете использовать @Bean для создания компонента для TransactionManagerImpl, как показано ниже.
@Configuration
public class Config {
@Value("${txnLogFile}")
private String txnLogFile;
@Bean
public TransactionManager transactionManager() {
return new TransactionManagerImpl(txnLogFile);
}
}
и удалите аннотацию @Service из TransactionManagerImpl.
Наконец, я сделал это, как показано ниже, теперь я уверен, что это лучший способ. Я не хотел иметь три реализации только из-за одной переменной.
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