package com.querydsl.example.sql.guice; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.matcher.Matchers; import com.google.inject.name.Names; import com.mchange.v2.c3p0.DataSources; import com.querydsl.example.sql.repository.TweetRepository; import com.querydsl.example.sql.repository.UserRepository; import com.querydsl.sql.Configuration; import com.querydsl.sql.H2Templates; import javax.inject.Named; import javax.inject.Singleton; import javax.sql.DataSource; import java.io.IOException; import java.sql.SQLException; import java.util.Map.Entry; import java.util.Properties; public class ServiceModule extends AbstractModule { @Override protected void configure() { Properties properties = new Properties(); try { properties.load(getClass().getResourceAsStream("/jdbc.properties")); } catch (IOException e) { throw new RuntimeException(e); } for (Entry<Object, Object> entry : properties.entrySet()) { bind(String.class).annotatedWith(Names.named((String)entry.getKey())) .toInstance((String) entry.getValue()); } bind(ConnectionContext.class).in(Scopes.SINGLETON); bind(TweetRepository.class).in(Scopes.SINGLETON); bind(UserRepository.class).in(Scopes.SINGLETON); TransactionInterceptor interceptor = new TransactionInterceptor(); requestInjection(interceptor); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Transactional.class), interceptor); } @Provides @Singleton public Configuration configuration() { return new Configuration(new H2Templates()); } @Provides @Singleton public DataSource dataSource(@Named("jdbc.user") String user, @Named("jdbc.password") String password, @Named("jdbc.url") String url, @Named("jdbc.driver") String driver) { try { Class.forName(driver); return DataSources.pooledDataSource(DataSources.unpooledDataSource( url, user, password)); } catch (SQLException | ClassNotFoundException e) { throw new RuntimeException(e); } } }