1
我對通常的webapp開發和Spring框架非常陌生。我正在關注這個Spring JDBC Transactions tutorial但是我不希望從一個類訪問數據庫服務,而是希望從多個類訪問它。數據源和jdbctemplate的依賴注入?
在本教程中定義了服務這樣
public class BookingService {
@Autowired
JdbcTemplate jdbcTemplate;
@Transactional
public void book(String... persons) {
for (String person : persons) {
System.out.println("Booking " + person + " in a seat...");
jdbcTemplate.update("insert into BOOKINGS(FIRST_NAME) values (?)", person);
}
};
public List<String> findAllBookings() {
return jdbcTemplate.query("select FIRST_NAME from BOOKINGS", new RowMapper<String>()
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString("FIRST_NAME");
}
});
}
}
這些
@Configuration
@EnableTransactionManagement
@EnableAutoConfiguration
public class Application {
@Bean
BookingService bookingService() {
return new BookingService();
}
@Bean
DataSource dataSource() {
return new SimpleDriverDataSource() {{
setDriverClass(org.h2.Driver.class);
setUsername("sa");
setUrl("jdbc:h2:mem");
setPassword("");
}};
}
@Bean
JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
System.out.println("Creating tables");
jdbcTemplate.execute("drop table BOOKINGS if exists");
jdbcTemplate.execute("create table BOOKINGS(" +
"ID serial, FIRST_NAME varchar(5) NOT NULL)");
return jdbcTemplate;
}
他們只在應用程序類實例化的服務,並做了那裏所有的交易
ApplicationContext ctx = SpringApplication.run(Application.class, args);
BookingService bookingService = ctx.getBean(BookingService.class);
//bookingService.doStuff()
豆
在我的測試項目中,我複製了相同的Bean定義,但我每形成了多個類別的交易。
public class foo {
ApplicationContext ctx = new AnnotationConfigApplicationContext(Application.class);
BookingService bookingService = ctx.getBean(BookingService.class);
bookingService.book(...);
// some other stuff
}
public class bar {
ApplicationContext ctx = new AnnotationConfigApplicationContext(Application.class);
BookingService bookingService = ctx.getBean(BookingService.class);
bookingService.findAllBookings(...);
// some other stuff
}
看來,當我在一個類中進行的所有交易只(例如,書和找到Foo類)性能達到要求。但是,當我嘗試將它們分成多個類時,它的行爲並不像預期的那樣。如果我在foo執行的書,我不能在找到的吧。我錯過了什麼概念?我實例化數據源和jdbctemplate的多個實例,因爲我多次實例化服務。但我認爲Spring處理注射?由於只有一個物理數據庫,因此只有一個數據源和jdbctemplate實例。我誤解了什麼概念?請幫助並指向正確的方向。謝謝。
這裏沒有注射。 YOu只是再次構建一切,並獲得新的副本。你應該在'foo'和'bar'類中注入'BookingService'。您不應該自己重建應用程序上下文,您必須構建一次,只將它連接到一起。 –
我遵循教程中的模式。我會盡力在我的項目中提出您的建議並在此報告。 TNX。 – user3386275
它工作。感謝M. Deinum – user3386275