Java属性配置梳理

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 梳理常见的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
相关文章
|
17天前
|
IDE Oracle Java
Java零基础(2) - Java环境配置
【8月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
32 5
Java零基础(2) - Java环境配置
|
9天前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
37 7
|
6天前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
13天前
|
存储 Java 测试技术
Java零基础教学(05):如何Java环境配置??
【8月更文挑战第5天】Java零基础教学篇,手把手实践教学!
31 3
|
14天前
|
Oracle IDE Java
Java零基础教学(04):如何Java环境配置??
【8月更文挑战第4天】Java零基础教学篇,手把手实践教学!
26 1
|
16天前
|
IDE Oracle Java
Java零基础教学(02):如何Java环境配置??
【8月更文挑战第2天】Java零基础教学(02):如何Java环境配置??
26 3
|
15天前
|
IDE Java 测试技术
Java零基础(4) - JDK、IntelliJ IDEA的安装和环境变量配置
【8月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
43 0
Java零基础(4) - JDK、IntelliJ IDEA的安装和环境变量配置
|
23天前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
23 3
|
6天前
|
小程序 Java 编译器
JAVA环境配置
Java功能强大且简单
15 0
|
22天前
|
Java Go C#
proto转java类时相关option配置
proto转java类时相关option配置
22 0