Java属性配置梳理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 梳理常见的Java属性配置

以数据库连接为例,展示如何进行属性配置。

直接使用

JDBCUtil对数据库进行操作:

public class JDBCUtil {

    public static final String URL = "jdbc:mysql://localhost:3306/jdbctest";
    public static final String USER = "root";
    public static final String PASSWORD = "password";
    public static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 1.加载驱动程序
            Class.forName(DRIVER);
            //2.获得数据库连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            //3.操作数据库
            stmt = conn.createStatement();
            //4.实现增删改查
            rs = stmt.executeQuery("SELECT * FROM user;");


            //如果有数据,rs.next()返回true
            while (rs.next()) {
                System.out.println("username= " + rs.getString("username") + ", password= "
                        + rs.getString("password") + ", name= " + rs.getString("name"));
            }

            stmt.close();
            conn.close();
        } catch (ClassNotFoundException ex1) {
            ex1.printStackTrace();
        } catch (SQLException ex2) {
            ex2.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                    //
                }
                rs = null;
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException sqlEx) {
                        //
                    }
                    conn = null;
                    if (conn != null) {
                        try {
                            conn.close();
                        } catch (SQLException sqlEx) {
                            //
                        }
                        conn = null; //垃圾回收机制会更早地垃圾释放

                    }
                }
            }
        }
    }

其中,urlusernamepassworddriverClassName等数据库连接所需的参数属性直接在代码中写死,后续如果有变化,需要更改所有使用的地方。所以,现在需要把这些属性从代码中单独抽取到配置文件中。

属性读取

将属性抽取到datasource.properties文件中:

# 驱动的Java类名
mydatasource.driverClassName=com.mysql.cj.jdbc.Driver
#传递给JDBC驱动的用于建立连接的URL
mydatasource.url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
#用户名和密码
mydatasource.username=root
mydatasource.password=1234

代码中使用DataSource对象:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DataSource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
}

配置文件到对象的映射如下:

public class DataSourceFactory {
    public static DataSource getDataSource() throws IOException {
        InputStream inputStream = DataSourceFactory.class.getResourceAsStream("/datasource.properties");
        Properties properties = new Properties();
        properties.load(inputStream);

        DataSource dataSource = DataSource.builder()
                .driverClassName(properties.getProperty("mydatasource.driverClassName"))
                .url(properties.getProperty("mydatasource.url"))
                .username(properties.getProperty("mydatasource.username"))
                .password(properties.getProperty("mydatasource.password"))
                .build();
        return dataSource;
    }
}

然后我们的数据库操作代码就变成了:

public class JDBCUtil {

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            DataSource dataSource = DataSourceFactory.getDataSource();
            // 1.加载驱动程序
            Class.forName(dataSource.getUrl());

            //2.获得数据库连接
            conn = DriverManager.getConnection(dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
            //3.操作数据库
            stmt = conn.createStatement();
            //4.实现增删改查
            rs = stmt.executeQuery("SELECT * FROM user;");


            //如果有数据,rs.next()返回true
            while (rs.next()) {
                System.out.println("username= " + rs.getString("username") + ", password= "
                        + rs.getString("password") + ", name= " + rs.getString("name"));
            }

            stmt.close();
            conn.close();
        } catch (ClassNotFoundException ex1) {
            ex1.printStackTrace();
        } catch (Exception ex2) {
            ex2.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                    //
                }
                rs = null;
                if (stmt != null) {
                    try {
                        stmt.close();
                    } catch (SQLException sqlEx) {
                        //
                    }
                    conn = null;
                    if (conn != null) {
                        try {
                            conn.close();
                        } catch (SQLException sqlEx) {
                            //
                        }
                        conn = null; //垃圾回收机制会更早地垃圾释放

                    }
                }
            }
        }
    }
}

PropertySource

在Spring项目中可以使用PropertySource配置文件到对象的映射:

# 驱动的Java类名
mydatasource.driverClassName=com.mysql.cj.jdbc.Driver
#传递给JDBC驱动的用于建立连接的URL
mydatasource.url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
#用户名和密码
mydatasource.username=root
mydatasource.password=1234
@Data
@Component
@PropertySource("datasource.properties")
public class DataSource {
    @Value("${mydatasource.driverClassName}")
    private String driverClassName;

    @Value("${mydatasource.url}")
    private String url;

    @Value("${mydatasource.username}")
    private String username;

    @Value("${mydatasource.password}")
    private String password;
}

DataSource能够直接当作bean使用

ConfigurationProperties

在SpringBoot项目中可以使用ConfigurationProperties实现配置文件(application.yml或者application.properties) 到对象的映射:

# 驱动的Java类名
mydatasource.driverClassName=com.mysql.cj.jdbc.Driver
#传递给JDBC驱动的用于建立连接的URL
mydatasource.url=jdbc:mysql://localhost:3306/jdbctest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
#用户名和密码
mydatasource.username=root
mydatasource.password=1234
@Configuration
@ConfigurationProperties(prefix = "mydatasource")
@Data
public class DataSource {

    private String driverClassName;

    private String url;

    private String username;

    private String password;
}

配置中心

如nacos:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

如nacos,见官方文档: https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

  1. 添加依赖。
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>
  1. 在 application.properties 中配置 Nacos server 的地址:
nacos.config.server-addr=127.0.0.1:8848
  1. 使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新:
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class, args);
    }
}
  1. 通过 Nacos 的 @NacosValue 注解设置属性值。
@Controller
@RequestMapping("config")
public class ConfigController {

    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
48 2
|
2月前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
|
2月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
144 1
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
31 2
|
2月前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
31 2
|
2月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
81 4
|
2月前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
116 4
|
2月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
70 2
|
2月前
|
负载均衡 算法 Java
java中nginx负载均衡配置
java中nginx负载均衡配置
44 0
|
2月前
|
Java
Java 集合存在相同属性,其他元素累加
Java 集合存在相同属性,其他元素累加
32 0