springboot補充
- 2020 年 12 月 3 日
- 筆記
- springboot
springboot中的日誌:
在默認的spring-boot-starter中,會引入spring-boot-starter-logging,
而springboot-starte-longing中引入了:slf4j規範和logback默認實現。
springboot對jdbc的支援:
引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
點進去實際上就是依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.5.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.2.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.7.RELEASE</version> <scope>compile</scope> </dependency> </dependencies>
一個連接池,一個spring-jdbc的包。這個的好處就是,通過條件註解來決定是否把jdbc-template裝載到ioc容器中:
@Configuration @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) @EnableConfigurationProperties(JdbcProperties.class) public class JdbcTemplateAutoConfiguration { @Configuration static class JdbcTemplateConfiguration { private final DataSource dataSource; private final JdbcProperties properties; JdbcTemplateConfiguration(DataSource dataSource, JdbcProperties properties) { this.dataSource = dataSource; this.properties = properties; } @Bean @Primary @ConditionalOnMissingBean(JdbcOperations.class) public JdbcTemplate jdbcTemplate() { JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource); JdbcProperties.Template template = this.properties.getTemplate(); jdbcTemplate.setFetchSize(template.getFetchSize()); jdbcTemplate.setMaxRows(template.getMaxRows()); if (template.getQueryTimeout() != null) { jdbcTemplate .setQueryTimeout((int) template.getQueryTimeout().getSeconds()); } return jdbcTemplate; } } @Configuration @Import(JdbcTemplateConfiguration.class) static class NamedParameterJdbcTemplateConfiguration { @Bean @Primary @ConditionalOnSingleCandidate(JdbcTemplate.class) @ConditionalOnMissingBean(NamedParameterJdbcOperations.class) public NamedParameterJdbcTemplate namedParameterJdbcTemplate( JdbcTemplate jdbcTemplate) { return new NamedParameterJdbcTemplate(jdbcTemplate); } } }
spring中多數據源問題:
簡單的可以藉助AbstractRoutingDataSource這個抽象類,結合aop來實現動態切換。
springboot的實現:
@Configuration public class JdbcDataSourceConfig { /** * 配置連接屬性1 * 前綴後面的屬性要與DataSourceProperties類中的屬性對應 * @return */ @Bean @ConfigurationProperties(prefix = "app.datasource.db1") public DataSourceProperties db1Properties(){ return new DataSourceProperties(); } /** * 配置連接屬性2 * 前綴後面的屬性要與DataSourceProperties類中的屬性對應 * @return */ @Bean @ConfigurationProperties(prefix = "app.datasource.db2") public DataSourceProperties db2Properties(){ return new DataSourceProperties(); } /** * 使用屬性配置資訊構建一個DataSource * @return */ @Bean public DataSource db1DataSource(){ return db1Properties().initializeDataSourceBuilder().build(); } @Bean public DataSource db2DataSource(){ return db2Properties().initializeDataSourceBuilder().build(); } /** * 不單獨配置bean的名稱了,使用方法名作為默認名稱 * @return */ @Bean public JdbcTemplate templateOne(){ return new JdbcTemplate(db1DataSource()); } @Bean public JdbcTemplate templateTwo(){ return new JdbcTemplate(db2DataSource()); } }
測試程式碼:
@SpringBootTest(classes= Application.class) @RunWith(SpringRunner.class) public class JdbcTest { @Autowired JdbcTemplate templateOne; @Test public void test() throws Exception{ String sql="insert into user(name,age) values('aa',18)"; templateOne.execute(sql); } }
報錯:
因為在將DataSourceProperties去注入到DataSource的時候發現存在多個DataSourceProperties的bean。因為去無論是db1Properties方法還是還是db2Properties都是返回一個DataSourceProperties,springboot無法根據上下文去推導,是需要哪個注入。jdbctemplate 通過bean的名字指定需要載入哪一個。
Actuator:springboot的監控服務:
引入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
啟動應用: 訪問: //localhost:8080/actuator
JMX:
支援自定義發布一些監控資訊。springboot支援簡化發布一個bean資訊到jmx。