您好,登錄后才能下訂單哦!
springboot的配置方式有哪些?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
java配置主要靠java類和一些注解,比較常用的注解有:
@Configuration :聲明一個類作為配置類,代替xml文件
@Bean :聲明在方法上,將方法的返回值加入Bean容器,代替 標簽
@Value :基本類型或String屬性注入
@PropertySource :指定外部屬性文件
后面以Druid連接池配置為例,數據庫名稱為springboot_test
方式一
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
# src/resources/jdbc.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java @Configuration @PropertySource("classpath:jdbc.properties") public class DruidConfig { @Value("${jdbc.url}") String url; @Value("${jdbc.driverClassName}") String driverClassName; @Value("${jdbc.username}") String username; @Value("${jdbc.password}") String password; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
解讀:
@Configuration :聲明我們 DruidConfig是一個配置類
@PropertySource :指定屬性文件的路徑是: classpath:jdbc.properties
@Value 為屬性注入值(只能是基本類型或String)
@Bean將 dataSource() 方法聲明為一個注冊Bean的方法,Spring會自動調用該方法,將方法的返回值加入Spring容器中。
方式二
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- ============不添加在IDEA 會報紅,但并不影響功能 ================= --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--============================================================== -->
# src/resources/application.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java @ConfigurationProperties(prefix = "jdbc") public class DruidProperties { private String url; private String driverClassName; private String username; private String password; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
//src\main\java\com\itheima\config\DruidConfig.java @Configuration @EnableConfigurationProperties(DruidProperties.class) public class DruidConfig { @Bean public DataSource dataSource(DruidProperties dp) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(dp.getDriverClassName()); dataSource.setUrl(dp.getUrl()); dataSource.setUsername(dp.getUsername()); dataSource.setPassword(dp.getPassword()); return dataSource; } }
解讀:
@ConfifigurationProperties注解聲明當前類為屬性讀取類,在類上定義各個屬性,名稱必須與屬性文件中 jdbc. 后面部分一致。
@EnableConfigurationProperties()聲明要使用的屬性讀取類,使用該類有三種注入方式
@Autowired注入
//src\main\java\com\itheima\config\DruidConfig.java @Configuration @EnableConfigurationProperties(DruidProperties.class) public class DruidConfig { @Autowired private DruidProperties dp; @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); //setter return dataSource; } }
構造函數注入
作為
//src\main\java\com\itheima\config\DruidConfig.java @Configuration @EnableConfigurationProperties(DruidProperties.class) public class DruidConfig { private DruidProperties dp; public DruidConfig(DruidProperties dp){ this.dp = dp; } @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); //setter return dataSource; } }
@Bean的方法參數注入(本例使用)
//src\main\java\com\itheima\config\DruidConfig.java @Configuration @EnableConfigurationPerProperties(DruidProperties.class) public class DruidConfig { @Bean public DataSource dataSource(DruidProperties dp) { DruidDataSource dataSource = new DruidDataSource(); //setter return dataSource; } }
方式二通過屬性讀取類解決了@Value不能讀取對象屬性(如user.friend.name)的問題,但似乎就更加麻煩了
方式三(推薦使用)
事實上,如果一段屬性只有一個Bean需要使用,我們無需將其注入到一個類。
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- ============不添加在IDEA 會報紅,但并不影響功能 ================= --> <dependency> <groupId> org.springframework.boot </groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!--============================================================== -->
# src/resources/application.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/bos jdbc.username=root jdbc.password=123456
@Configuration public class DruidConfig { @Bean @ConfigurationProperties(prefix = "jdbc") public DataSource dataSource() { return new DruidDataSource(); } }
方式四
<!--pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
# src/resources/application.properties spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bos spring.datasource.username=root spring.datasource.password=123456
思考:為什么這種方式不需要配置類可以讀取配置信息?
啟動類跑main方法時候,查看SpringApplication構造方法,如下追蹤
容易發現,它是從 META-INF/spring.factories 中獲取類名信息,存儲在一鍵多值的Map中,打開spring.factories,debug對比
發現鍵是文件藍色部分,值是綠色部分,往回看不難發現它將這些獲取的類都生成了實例,注入到IOC容器中。
打開 DataSourceProperties 發現這不是方式二嗎?
點進DataSourceProperties.class
總結:當我們添加依賴后,執行啟動類時自動加載DataSourceAutoConfiguration,讀取DataSourceProperties類,根據默認的前綴spring.datasource在application.xml中讀取信息
看完上述內容,你們掌握springboot的配置方式有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。