一、什么是解耦?
解耦就是为了降低程序之间的耦合性,在软件工程中,对象之间的耦合度就是对象之间的关联度。程序之间耦合度越高,程序维护起来也就越困难,即程序维护成本高。所以我们需要通过现有方法降低耦合性,也就是解耦。
更官方的解耦概念是:解耦是计算机科学与软件工程中的一个概念,指的是降低系统中不同部分之间的依赖性。使得系统的各个组件能够相对独立的进行开发、维护和演化。
二、解耦的目的?
解耦的目的:减少组件之间的紧密耦合,以提高系统的灵活性、可维护性和可扩展性。
三、演示解耦过程
创建项目,测试 pom.xml 自动导 jar包效果——是否可以连接到mySql数据库
1、新建一个 Maven 项目
2、选择 maven ,单击右下角 next
3、给项目起名,选择保存路径,填写组织名称,然后 finish
Name <======> 给项目起名,随便起名(我的项目名叫 Spring_ioc_01)
选择保存路径 <======> 自己选一个磁盘固定位置专门保存 Project 文件
填写组织名称 <======> 可以用默认的,也可以自己起名
4、项目创建成功后,在pom.xml 文件添加想要的 jar包的坐标
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 注释内容 --> <!-- 以下是maven项目信息 --> <!-- groupId 组织名称 --> <groupId>com.apesource</groupId> <!-- artifactId 项目名称 --> <artifactId>Demo001</artifactId> <!-- version 版本 --> <version>1.0-SNAPSHOT</version> <!-- 添加坐标 --> <dependencies> <!-- 我们想要测试连接到 mySQL 数据库,我们就需要添加 mysql 的坐标 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> </dependencies> </project>
5、在 src 下的 main 下的 java 包中建立一个包,包里新建个测试类
我就建立了一个 com.apesource.test 包,com.apesource.test 包下有一个 Test01 测试类
目前就是这个样子:我们在新建的项目 Spring_ioc_01 中建立了一个 Test01 测试类并在 pom.xml 文件中添加了 mysql 的坐标
接下来我们就在测试类写连接数据库的代码来测试
(一)高耦合演示
package com.apesource.test;
import java.sql.Connection;
import java.sql.DriverManager;
public class Test01 {
public static void main(String[] args) throws Exception{
/*********************高耦合--通过 new对象**************************/
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Connection root = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT",
"root", "123456");
System.out.println(root);
}
}
(二)中耦合演示
package com.apesource.test;
import java.sql.Connection;
import java.sql.DriverManager;
public class Test01 {
public static void main(String[] args) throws Exception{
/*********************中耦合,不new对象**************************/
Class.forName("com.mysql.cj.jdbc.Driver");//通过反射加载名称即字符串
Connection root = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT",
"root", "123456");
System.out.println(root);
}
}
(三)低耦合演示
在中耦合基础上再次优化,将加载驱动、地址、用户名和密码写在 jdbc.properties 文件中,这样主代码就算地址、用户名和密码有所改变也不需要改变主代码,只需要修改 jdbc.properties 文件内容即可,最大程度降低了耦合
1、创建文件 src-main-resource右击-New-File回车
2、在 jdbc.properties 文件中写我们的加载驱动、地址、用户名和密码并赋值给自定义参数,我给它们起名 msd1、msd2、msd3、msd4
#key=value形式(#是注释)
msd1=com.mysql.cj.jdbc.Driver
msd2=jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT
msd3=root
msd4=123456
3、测试
package com.apesource.test;
import java.sql.Connection;
import java.sql.DriverManager;
public class Test01 {
public static void main(String[] args) throws Exception{
/*************************低耦合******************************/
//1.创建工具类--我们的工具类文件后缀为properties,所以我们要先new一个它
Properties properties = new Properties();
//2.加载文件--通过字节码文件加载我们的 jdbc.properties 文件,得到一个流,加载流
InputStream inputStream =
Test01.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(inputStream);
//3.通过key获取values
String driver =properties.getProperty("msd1");
String url = properties.getProperty("msd2");
String user = properties.getProperty("msd3");
String pwd = properties.getProperty("msd4");
//4.获取链接
Class.forName(driver);
Connection root = DriverManager.getConnection(url,user,pwd);
System.out.println(root);
}
}
以上三个代码结果都为下面所示结果,仅仅是改变了各组件间的耦合性而已,代码运行成功
代码结果(运行成功):