package org.sef4j.testwebapp.config; import javax.sql.DataSource; import org.sef4j.jdbc.optional.hikari.HikariDataSourceProxyInstrumenter; import org.sef4j.jdbc.optional.tomcatpool.TomcatPoolDataSourceProxyInstrumenter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.orm.jpa.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @Configuration @ComponentScan(basePackages = { "org.sef4j.testwebapp" }) @EnableAutoConfiguration( exclude = { MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class, SecurityAutoConfiguration.class // org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.class }) //@EnableWebMvc @EntityScan(basePackages = { "org.sef4j.testwebapp.domain" }) @EnableJpaRepositories(basePackages = { "org.sef4j.testwebapp.repository" }) public class ApplicationConfig { private static final Logger LOG = LoggerFactory.getLogger(ApplicationConfig.class); @Autowired private DataSourceProperties properties; /** cf org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration */ @Bean @ConfigurationProperties(prefix = DataSourceProperties.PREFIX) public DataSource dataSource() { LOG.info("building DataSource"); // DataSourceBuilder factory = DataSourceBuilder // .create(this.properties.getClassLoader()) // .driverClassName(this.properties.getDriverClassName()) // .url(this.properties.getUrl()) // .username(this.properties.getUsername()) // .password(this.properties.getPassword()); // return factory.build(); HikariConfig config = new HikariConfig(); // JDBCDataSource underlyingDS = new JDBCDataSource(); // config.setDataSource(underlyingDS); config.setDriverClassName(this.properties.getDriverClassName()); config.setJdbcUrl(this.properties.getUrl()); config.setUsername(this.properties.getUsername()); config.setPassword(this.properties.getPassword()); HikariDataSource ds = new HikariDataSource(config); // cf next // HikariDataSourceProxyInstrumenter.injectSefDataSourceProxyInto(ds); return ds; } @Value("${" + DataSourceProperties.PREFIX + ".enableSef4jInstrumentation" + ":true}") protected boolean enableSef4jDataSourceProxy; @Bean public BeanPostProcessor sef4jDataSourcePostProcessor() { return new BeanPostProcessor() { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (enableSef4jDataSourceProxy && bean instanceof DataSource && beanName.equals("dataSource")) { DataSource ds = (DataSource) bean; if (ds instanceof HikariDataSource) { LOG.info("injecting sef4j instrumentation in DataSource connection pool: HikariDataSource"); HikariDataSource hikariDS = (HikariDataSource) ds; HikariDataSourceProxyInstrumenter.injectSefDataSourceProxyInto(hikariDS); } else if (bean instanceof org.apache.tomcat.jdbc.pool.DataSource) { LOG.info("injecting sef4j instrumentation in DataSource connection pool: Tomcat Pool"); TomcatPoolDataSourceProxyInstrumenter.injectSefDataSourceProxyInto(ds); } else { LOG.warn("IGNORE injecting sef4j instrumentation in DataSource connection pool: unknown pool type"); } } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }; } }