首頁 > 軟體

SpringBoot自定義bean繫結實現

2022-10-23 18:01:30

自定義bean繫結

在組態檔中寫入

servers:
 ipAddress: 192.158.0.1
 port: 1234
 detail: zhangsan

定義一個實體類物件去接受這些屬性

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") //組態檔的位置,對應的屬性注入
public class ServerConfig {
    private String ipAddress;
    private int port;
    private String detail;
}

啟動類下的

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);
    }
}

匯入第三方bean

注入方式有許多,可以匯入在寫一個設定類,然後加上@Bean即可,啟動類中的@SpringBootApplication本身就是一個設定類。所以直接在這寫也可以。

匯入druid座標

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.12</version>
        </dependency>

啟動類

@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);
    }
}

執行出來什麼也沒

第三方bea通過組態檔注引數

application.yml下

datasource:
 driverClassName: "com.mysql.jdbc.driver.zhkc"
 username: "張三"
 password: kczh

啟動類下

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());
    }
}

執行結果

出現Prefix must be in canonical form

這是因為prefix屬性只能用小寫,不能使用駝峰命名法,改成小寫即可

@EnableConfigurationProperties()和@ConfigurationProperties的區別

@EnableConfigurationProperties開啟對應的屬性功能,可以通過設定中的屬性,讓我們對應的類名來做屬性注入 ,這樣也可以看出有哪些類通過spring去管理

@ConfigurationProperties是做具體的屬性繫結的,對應的組態檔。

當我們使用了@EnableConfigurationProperties,且又在類總使用了@Component,就會報錯,如下

這個錯誤是,找到兩個bean,一個類對應著兩個bean導致不唯一了。

原因是:@EnableConfigurationProperties(ServerConfig.class),預設會 交給spring容器去管理,而要想讓spring去管理,首先得是一個bean物件,所就會把這個ServerConfig.class變成bean物件。我們在那個類中寫了@Component,這個註解也是說這個是一個bean物件,這樣就導致了同一個類中對應了兩個bean物件,所以產生錯誤。這兩個註解不能同時使用,一般使用@EnableConfigurationProperties更能體現出是哪個類受spring管且需要設定注入。

解除@ConfigurationProperties註解警告

原因:springboot設定的處理器並沒有設定,現在不能識別這個註解

解決:那就給它加上

pom.xml加上:

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

這樣警告就沒有了。

@ConfigurationProperties可以為第三方的bean繫結屬性。

@ConfigurationProperties的鬆散繫結

也叫寬鬆繫結,指的是在組態檔中的引數名任意大小寫下劃線或者中線,都會給你匹配出來。

在實體類中也可以識別並正常執行。

@Value不支援寬鬆繫結

@ConfigurationProperties繫結字首命名規範(prefix):僅能使用純小寫字母、數位、下劃線作為合法的字元(以後都使用小寫更方便。)

小結:

@ConfigurationProperties繫結屬性支援屬性名寬鬆繫結

@Value註解不支援寬鬆繫結

繫結的字首命名有規則

到此這篇關於SpringBoot自定義bean繫結實現的文章就介紹到這了,更多相關SpringBoot bean繫結內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com