关于自定义程序打包成jar包,并读取配置

本文探讨了在Java开发中将程序打成jar包时的配置管理,介绍了从数据库读取、文件读取、以及利用Spring自动装配的三种方式,分析了各自的优缺点,并推荐使用Spring自动装配以提高内存效率和代码可维护性。
摘要由CSDN通过智能技术生成

前言

在实际开发过程中,我们有时候有把你编写的一段程序打成jar包的需求,而一些配置是需要去配置文件里面读取关于这项目的一些配置,本人在网络上查询了众多的资料,总的来说可以归为3类

1.从数据库读取配置

   老生常谈,在dao层从数据库获取配置信息,然后返回到Service层进行业务逻辑处理

2.在每次调用这个jar的时候通过关键字去读取配置

  在这一类中,方法有很多,不过大体都是

1

InputStream ins = getClass().getResourceAsStream("/resource/dbconfig.properties");

  通过IO流对配置文件进行读取,然后再从 InputStream 流中读取数据,没什么技术含量,便不多讲

例如以下例子,就是通过Properties流来读取配置 

复制代码

 /**
     * 读取配置文件属性
     * @param path  配置文件路径
     * @return
     * @throws IOException
     */
    public Map readerConfigurationFile(String path) throws IOException {
        /**
         * 使用Properties读取配置文件并获取配置信息
         */
        Properties properties = new Properties();
        InputStream input = new BufferedInputStream(new FileInputStream(path));
        properties.load(input);

        /**
         * 将获取到的配置信息转存到map集合
         */
        Map map = new HashMap();
        for (Object key : properties.keySet()) {
            if (properties.get(key) != null && !properties.get(key).toString().trim().equals("")){
                map.put(key,properties.get(key));
            }
        }
        return map;
    }

复制代码

3.通过Spring 自动装配,在项目启动时就把配置信息发送到jar包里面(强烈推荐)

  这个方法虽然前期建立的时候比较繁琐,但是完成之后简直方便到飞起

  首先,建立一下格式的结构,方便我们后面能够快捷找到要编写的文件

实际上DemoApplication.java 是可以去掉的,只是个人为了方便测试写的代码,看是否有bug就留下来启动项目用的

 最最最重要的pom.xml文件应该这样写:

复制代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-->--------------------这里是自己jar的情况,自己编写---------  -------<-->
<modelVersion>4.0.0</modelVersion> <groupId>com.transfer</groupId> <artifactId>DataTransferService</artifactId> <version>0.0.1-SNAPSHOT</version> <name>DataTransferService</name> <description>DataTransferService</description> <properties> <spring-boot.version>2.6.13</spring-boot.version> </properties>
<!-->---------------------------------------------------------------<-->

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- 自动配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <!-- 配置属性 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional><!-- 依赖不传递 -->
        </dependency>

        <!--Lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--mysql数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

复制代码

  在config包里面,我们要建立几个配置文件:

UserConfiguration.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Slf4j

@Configuration

@ConditionalOnExpression("${enabled:true}")

@EnableConfigurationProperties(UserConfiguration .class)

public class UserConfiguration {

    @Bean

    @Primary

    public UserConfig getConfigValue(UserProperties properties){

        if (properties.getLog()){

            log.info("数据库中转服务API组件 ——> 开启组件");

        }

        return new UserConfig()

                .setOtherDataSourcesMap(properties.getOtherDataSourcesMap())

                .setLog(properties.getLog());

    }

}

UserConfig.java

1

2

3

4

5

6

7

8

@Data

@Accessors(chain = true)

public class UserConfig implements Serializable {

    private Map<String,Map<String,Map<String,Object>>> otherDataSourcesMap;

    /** 是否打印操作日志 */

    private Boolean log = true;

}

UserProperties.java

1

2

3

4

5

6

7

8

9

10

11

12

@Data

@ConfigurationProperties(prefix = "User")

public class UserProperties implements Serializable {

    private Map<String,Map<String,Map<String,Object>>> otherDataSourcesMap;

    /** 是否开启 */

    boolean enabled = true;

    /** 是否打印操作日志 */

    private Boolean log = false;

}<br>请注意:这里的@ConfigurationProperties 注解里面的 prefix 参数指的是在配置文件中你自己定义的标识符

UserBeanInject.java

1

2

3

4

5

6

7

8

9

10

11

12

public class UserBeanInject {

    /**

     * 注入配置Bean

     *

     * @param config 配置对象

     */

    @Autowired(required = false)

    public void setConfig(UserConfig config){

        UserSpi.setConfig(config);

    }

}

 当然,还有重要的一步,那就是在resources文件夹下创建一个Spring自动装配的约定文件,使得我们这几个java配置文件能够生效

 spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  自己定义的包路径.configuration.UserConfiguration, \
  自己定义的包路径.configuration.UserBeanInject

 然后,我们要暴露这个接口

UserSpi.Java

复制代码

@Slf4j
public class UserSpi{
    public volatile static UserConfig config;

    public static void setConfig(UserConfig config){
        UserSpi.config = config;
        if (config.getLog()){
            log.info("数据库中转服务API组件 ——> 打印配置信息\n", JSONUtil.toJsonStr(UserSpi.config));
        }
    }

    // =================== 获取Api 相关 ===================

    public static IUserService api = new UserServiceImpl();
}

复制代码

这样基本上完成jar自动装配外部配置文件的配置,业务逻辑什么的看个人习惯自己去编写

感言

  • 从数据库里面读取配置信息方便时挺方便的,但是在高并发与高请求的项目中并不适用,而每次调用这个jar的时候通过关键字去读取配置会造成内存资源不断被刷新,容易内存爆炸,个人推荐第3种方式。
  • 还有,每次该改写完代码,一定要重新构建项目,重新编译一下,不然你打出来的Jar包,永远都是你改写之前的代码,改写之后的代码不会写入到Jar包里面!!!!
  • 对了,直接把配置文件里面的值直接传递到jar包里面也是一种方法,但是要是被半路拦截,岂不是直接泄露数据,故不提倡,还有一点,就是代码的可维护性会变得很低
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你的Matlab自定义函数生的图像是一个RGB图像,那么在Java中可以将其表示为一个三维数组,即一个MxNx3的数组,其中M和N表示图像的宽度和高度。在Spring Boot后端中,你可以使用Java的ImageIO类读取图像数据并将其转换为一个三维数组。假设你的Matlab函数名为`myCustomFunction`,你可以使用以下代码读取图像数据并将其转换为一个三维数组: ```java import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageProcessor { public static Object[] processImage(String imagePath) { try { BufferedImage image = ImageIO.read(new File(imagePath)); int width = image.getWidth(); int height = image.getHeight(); int[][][] rgb = new int[width][height][3]; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { int color = image.getRGB(i, j); rgb[i][j][0] = (color >> 16) & 0xff; // Red component rgb[i][j][1] = (color >> 8) & 0xff; // Green component rgb[i][j][2] = color & 0xff; // Blue component } } return new Object[] { rgb }; } catch (Exception e) { // Handle exception } return null; } } ``` 这个函数将读取指定路径的图像,将其转换为一个三维数组,并将其作为一个Object数组返回。在你的Spring Boot应用程序中,你可以调用这个函数并获取图像数据: ```java @RestController @RequestMapping("/image") public class ImageController { @GetMapping("/{imageName}") public ResponseEntity<Object[]> getImageData(@PathVariable String imageName) { String imagePath = "/path/to/images/" + imageName + ".jpg"; Object[] imageData = ImageProcessor.processImage(imagePath); if (imageData != null) { return ResponseEntity.ok().body(imageData); } else { return ResponseEntity.notFound().build(); } } } ``` 这个控制器将接受一个图像名称作为路径变量,并调用`processImage`函数获取图像数据。如果获取功,它将返回一个包含图像数据的Object数组。如果获取失败,它将返回404状态码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值