SpringBoot自定義bean綁定實(shí)現(xiàn)
自定義bean綁定
在配置文件中寫入
servers:
ipAddress: 192.158.0.1
port: 1234
detail: zhangsan
定義一個(gè)實(shí)體類對(duì)象去接受這些屬性
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Data //lombok省去get/set/toString @Component //交給spring容器管理 @ConfigurationProperties(prefix = "servers") //配置文件的位置,對(duì)應(yīng)的屬性注入 public class ServerConfig { private String ipAddress; private int port; private String detail; }
啟動(dòng)類下的
import com.pojo.ServerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class Springboot11ConfigurationApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args); ServerConfig bean = run.getBean(ServerConfig.class); System.out.println(bean); } }
導(dǎo)入第三方bean
注入方式有許多,可以導(dǎo)入在寫一個(gè)配置類,然后加上@Bean即可,啟動(dòng)類中的@SpringBootApplication本身就是一個(gè)配置類。所以直接在這寫也可以。
導(dǎo)入druid坐標(biāo)
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.12</version> </dependency>
啟動(dòng)類
@SpringBootApplication public class Springboot11ConfigurationApplication { @Bean//注入 public DruidDataSource druidDataSource(){ DruidDataSource ds=new DruidDataSource(); return ds; } public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args); ServerConfig bean = run.getBean(ServerConfig.class); System.out.println(bean); DruidDataSource dds = run.getBean(DruidDataSource.class); System.out.println(dds); } }
運(yùn)行出來什么也沒
第三方bea通過配置文件注參數(shù)
application.yml下
datasource:
driverClassName: "com.mysql.jdbc.driver.zhkc"
username: "張三"
password: kczh
啟動(dòng)類下
package com; import com.alibaba.druid.pool.DruidDataSource; import com.pojo.ServerConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Springboot11ConfigurationApplication { @Bean @ConfigurationProperties(prefix = "datasource") public DruidDataSource druidDataSource(){ DruidDataSource ds=new DruidDataSource(); return ds; } public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Springboot11ConfigurationApplication.class, args); // ServerConfig bean = run.getBean(ServerConfig.class); // System.out.println(bean); DruidDataSource dds = run.getBean(DruidDataSource.class); System.out.println(dds.getDriverClassName()); System.out.println(dds.getUsername()); System.out.println(dds.getPassword()); } }
運(yùn)行結(jié)果
出現(xiàn)Prefix must be in canonical form
這是因?yàn)閜refix屬性只能用小寫,不能使用駝峰命名法,改成小寫即可
@EnableConfigurationProperties()和@ConfigurationProperties的區(qū)別
@EnableConfigurationProperties開啟對(duì)應(yīng)的屬性功能,可以通過配置中的屬性,讓我們對(duì)應(yīng)的類名來做屬性注入 ,這樣也可以看出有哪些類通過spring去管理
@ConfigurationProperties是做具體的屬性綁定的,對(duì)應(yīng)的配置文件。
當(dāng)我們使用了@EnableConfigurationProperties,且又在類總使用了@Component,就會(huì)報(bào)錯(cuò),如下
這個(gè)錯(cuò)誤是,找到兩個(gè)bean,一個(gè)類對(duì)應(yīng)著兩個(gè)bean導(dǎo)致不唯一了。
原因是:@EnableConfigurationProperties(ServerConfig.class),默認(rèn)會(huì) 交給spring容器去管理,而要想讓spring去管理,首先得是一個(gè)bean對(duì)象,所就會(huì)把這個(gè)ServerConfig.class變成bean對(duì)象。我們?cè)谀莻€(gè)類中寫了@Component,這個(gè)注解也是說這個(gè)是一個(gè)bean對(duì)象,這樣就導(dǎo)致了同一個(gè)類中對(duì)應(yīng)了兩個(gè)bean對(duì)象,所以產(chǎn)生錯(cuò)誤。這兩個(gè)注解不能同時(shí)使用,一般使用@EnableConfigurationProperties更能體現(xiàn)出是哪個(gè)類受spring管且需要配置注入。
解除@ConfigurationProperties注解警告
原因:springboot配置的處理器并沒有配置,現(xiàn)在不能識(shí)別這個(gè)注解
解決:那就給它加上
pom.xml加上:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency>
這樣警告就沒有了。
@ConfigurationProperties可以為第三方的bean綁定屬性。
@ConfigurationProperties的松散綁定
也叫寬松綁定,指的是在配置文件中的參數(shù)名任意大小寫下劃線或者中線,都會(huì)給你匹配出來。
在實(shí)體類中也可以識(shí)別并正常運(yùn)行。
@Value不支持寬松綁定
@ConfigurationProperties綁定前綴命名規(guī)范(prefix):僅能使用純小寫字母、數(shù)字、下劃線作為合法的字符(以后都使用小寫更方便。)
小結(jié):
@ConfigurationProperties綁定屬性支持屬性名寬松綁定
@Value注解不支持寬松綁定
綁定的前綴命名有規(guī)則
到此這篇關(guān)于SpringBoot自定義bean綁定實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot bean綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn) 基于密度的局部離群點(diǎn)檢測------lof算法
這篇文章主要介紹了Java實(shí)現(xiàn) 基于密度的局部離群點(diǎn)檢測------lof算法,本文通過算法概述,算法Java源碼,測試結(jié)果等方面一一進(jìn)行說明,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Java Set接口及常用實(shí)現(xiàn)類總結(jié)
Collection的另一個(gè)子接口就是Set,他并沒有我們List常用,并且自身也沒有一些額外的方法,全是繼承自Collection中的,因此我們還是簡單總結(jié)一下,包括他的常用實(shí)現(xiàn)類HashSet、LinkedHashSet、TreeSet的總結(jié)2023-01-01Java中的== 和equals()方法詳解與實(shí)例
本篇文章介紹了,在java中"==" 與equals方法的使用及其實(shí)例,需要的朋友可以參考下2017-04-04SpringBoot?Loki安裝簡介及實(shí)戰(zhàn)思路
這篇文章主要為大家介紹了SpringBoot?Loki安裝簡介及實(shí)戰(zhàn)思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪的相關(guān)資料2022-11-11Spring實(shí)戰(zhàn)之讓Bean獲取Spring容器操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之讓Bean獲取Spring容器操作,結(jié)合實(shí)例形式分析了Bean獲取Spring容器的相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼
現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗(yàn)證碼登錄功能設(shè)計(jì)與實(shí)現(xiàn),感興趣的可以了解一下2021-11-11spring boot security自定義認(rèn)證的代碼示例
這篇文章主要介紹了spring boot security自定義認(rèn)證,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07