SpringBoot中,如何把自定義的yml配置檔案中的內容和對應類的bean物件取出

loopyhz發表於2024-10-03

首先 yml檔案中的自定義配置如下

login-type-config:
  types:
    k1: "yuheng0"
    k2: "yuheng1"

我們有兩個對應的類,yuheng0 和 yuheng1 ,他們都實現了say介面,並且重寫了say方法。下面要透過請求k1 k2 獲取yuheng0 和 yuheng1類的bean物件。

注意,要記得加上Component註解 交給IOC容器管理他們

這兩個類的具體內容如下

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class yuheng0 implements say{


    public void say(){
        System.out.println("yuheng0");
    }

    @Override
    public String toString() {
        return "k1 to string";
    }
}

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class yuheng1 implements say{


    public void say(){
        System.out.println("yuheng1");
    }

    @Override
    public String toString() {
        return "k2 to string";
    }
}

package com.example.demo;

public interface say {
    void say();
}

下面是配置類,可以這麼寫配置來讀取自定義配置的資訊。這邊的map是string string型別的,也就是單純的把配置類的資訊以String的形式讀到map裡面

package com.example.demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
@ConfigurationProperties(prefix = "login-type-config") // 注意要對應
public class LoginTypeConfig {
    private Map<String,String> types;

    public Map<String, String> getTypes() {
        return types;
    }

    public void setTypes(Map<String, String> types) {
        this.types = types;
    }
}

最後就是最關鍵的邏輯,實現ApplicationContextAware介面,他可以根據名稱從ioc容器中取出對應的bean

這次我們自定義的map型別是string 和 say。根據名稱拿到對應的bean物件,也就是yuheng0和yuheng1的物件。放到自定義的map裡面。在請求test的時候,從map中拿出已經準備好的bean物件就可以了。

package com.example.demo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;


@RestController
public class demo implements ApplicationContextAware {

    @Autowired
    private LoginTypeConfig loginTypeConfig;

    private static Map<String,say> res = new HashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        loginTypeConfig.getTypes().forEach((k, v) -> {
            res.put(k, (say)applicationContext.getBean(v));
        });
    }


    @GetMapping("/test")
    public say test(String type)
    {
        say s = res.get(type);
        System.out.println(s.toString());
        s.say();
        return s;
    }

}

相關文章