2014-03-13 44 views
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實例。我誤解了什麼概念?請幫助並指向正確的方向。謝謝。

+2

這裏沒有注射。 YOu只是再次構建一切,並獲得新的副本。你應該在'foo'和'bar'類中注入'BookingService'。您不應該自己重建應用程序上下文,您必須構建一次,只將它連接到一起。 –

+0

我遵循教程中的模式。我會盡力在我的項目中提出您的建議並在此報告。 TNX。 – user3386275

+0

它工作。感謝M. Deinum – user3386275

回答

-1

你需要注入你的依賴,例如:

public class Foo { 

    @Autowired 
    private BookingService bookingService; 

    public doStuff() { 
     bookingService.book(...); 
     // some other stuff 
    } 
}