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。