亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot如何加載jar包內配置文件

發布時間:2021-07-07 16:02:42 來源:億速云 閱讀:1692 作者:chen 欄目:大數據

本篇內容主要講解“springboot如何加載jar包內配置文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“springboot如何加載jar包內配置文件”吧!

1、springboot啟動 如何加載jar包內注解類?

    springboot的 Application類會自動掃描加載其package 及其子package的類,但是其他package 或 jar中的類不會自動被掃描到, 這時需要配置 掃描路徑:

@ComponentScan(basePackages = {"com.ysma.oschina", "com.ysma.csdn"},//指定package
		excludeFilters = {@ComponentScan.Filter(value = Other.class, 
                          type= FilterType.ASSIGNABLE_TYPE)})//排除csdn jar包中個別類
public class OschinaApplication {

	public static void main(String[] args) {
		SpringApplication.run(Oschina.class, args);
	}

}
  • @ComponentScan注釋類型的參數含義

    basePackages:參數是用于掃描帶注釋組件的基本包

    basePackageClasses:對basepackages()指定掃描注釋組件包類型安全的替代

    excludeFilters:指定不適合組件掃描的類型

    includeFilters:指定哪些類型有資格用于組件掃描

    lazyInit:指定是否應注冊掃描的beans為lazy初始化

    useDefaultFilters:指示是否自動檢測類的注釋

  • @Filter中FilterType包含的類型及意義

    ANNOTATION:注解類型

    ASSIGNABLE_TYPE:ANNOTATION:指定的類型

    ASPECTJ:按照Aspectj的表達式,基本上不會用到

    REGEX:按照正則表達式

    CUSTOM:自定義規則  需實現自定義FilterType 如下:

 public class MyFilterType implements TypeFilter {
 
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
 
        if (metadataReader.getClassMetadata().getClassName().contains("Department")){
            //獲取當前類注解的信息
            AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
            for (String s : annotationMetadata.getAnnotationTypes()) {
                System.out.println("當前正在被掃描的類注解類型" + s);
            }
            //獲取當前正在掃描類的信息
            ClassMetadata classMetadata = metadataReader.getClassMetadata();
            System.out.println("當前正在被掃描的類的類名" + classMetadata.getClassName());
            //獲取當前類的資源信息(類存放的路徑...)
            Resource resource = metadataReader.getResource();
            System.out.println("當前正在被掃描的類存放的地址" + resource.getURL());
            return true;
        }
        return false;
    }
}

2、jar包內加載資源

  •     路徑問題  overview.properties放在resource根目錄的config文件夾下

     resource工程路徑不行,會自動指定到jar包所在工程資源路徑,如 /config/overview.properties

     resource 類路徑不行,會自動指定到jar包所在工程類路徑,如 config/overview.properties

     classpath路徑可行,會自動識別并加載類路徑,如classpath:config/overview.properties   此時配置文件放在父工程的classpath目錄下

    ResourceUtil實例如下

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.net.URL;

/**
 * 資源加載工具
 * 本應用為jar包應用,主要使用classpath路徑
 * @see this getClassPathFile
 */
@Slf4j
public class ResourceUtil {

    private static final String PATH_WINDOWS = "\\\\";

    private static final String PATH_LINUX = "/";

    /**
     * 讀取jar包文件
     * @param pathName 路徑
     * @return inputStream
     * @throws FileNotFoundException
     */
    public static URL getJarURL(String pathName) throws FileNotFoundException {
        try {
            ClassPathResource classPathResource = new ClassPathResource(pathName);
            return classPathResource.getURL();
        } catch (IOException e) {
            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", pathName);
            throw new FileNotFoundException(pathName + "文件不存在");
        }
    }

    /**
     * jar包內文件的獲取
     * @param classPath 因為性對路徑問題,通過classpath獲取比較好
     * @return 文件 classpath:config/overview.properties
     * @throws FileNotFoundException ex
     */
    @Deprecated
    public static File getClassPathFile(String classPath) throws FileNotFoundException {
        try {
            return ResourceUtils.getFile(classPath);
        } catch (FileNotFoundException e) {
            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", classPath);
            throw new FileNotFoundException(classPath + "文件不存在");
        }
    }

    /**
     * 獲取文件路徑
     * @param path 文件路徑
     * @return URL
     */
    public static URL getResourcePath(String path) throws FileNotFoundException {
        try {
            //1.以Linux路徑為準
            path = path.replaceAll(PATH_WINDOWS, PATH_LINUX);

            /*
              2.依據開頭自主選擇加載方法
              第一:前面有 "/" 代表了工程的根目錄,例如工程名叫做myproject,"/"代表了myproject
              第二:前面沒有 "" 代表當前類的目錄
             */
            return path.startsWith(PATH_LINUX) ?
                    ResourceUtil.class.getResource(path) :
                    ResourceUtil.class.getClassLoader().getResource(path);
        } catch (Exception e) {
            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", path);
            throw new FileNotFoundException(path + "文件不存在");
        }
    }

    /**
     * 獲取文件
     * @see #getJarURL(String path)
     */
    public static File getJarFile(String path) throws FileNotFoundException {
        try {
            ClassPathResource classPathResource = new ClassPathResource(path);
            InputStream is = classPathResource.getInputStream();
            File tempFile = File.createTempFile("groovy", null);
            IOUtils.copy(is, new FileOutputStream(tempFile));
            return tempFile;
        } catch (IOException e) {
            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", path);
            throw new FileNotFoundException(path + "文件不存在");
        }
    }
}

3、classpath路徑問題   如上2中如果配置文件放置在jar包中,則class地址應為:classpath*:config/overview.properties

    classpath和classpath*區別: 

    A:classpath:只會到你的class路徑中查找找文件。

    B:classpath*:不僅包含class路徑,還包括jar文件中(class路徑)進行查找。

    C:在多個classpath中存在同名資源,都需要加載時,那么用classpath:只會加載第一個,這種情況下也需要用classpath*:前綴。

    注意: 用classpath*:需要遍歷所有的classpath,所以加載速度是很慢的;因此,在規劃的時候,應該盡可能規劃好資源文件所在的路徑,盡量避免使用classpath*。

到此,相信大家對“springboot如何加載jar包內配置文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁陕县| 纳雍县| 项城市| 古浪县| 神池县| 五家渠市| 新乡县| 手机| 蒙山县| 柞水县| 阿拉善右旗| 报价| 封丘县| 樟树市| 北海市| 榕江县| 华池县| 庆阳市| 富源县| 双峰县| 江北区| 余姚市| 邳州市| 深水埗区| 秦安县| 洪湖市| 宁陵县| 沧州市| 屏山县| 江山市| 阿瓦提县| 若尔盖县| 辽阳市| 湟源县| 盐源县| 江津市| 丹凤县| 漳平市| 祁东县| 陆良县| 凉城县|