Spring 的 5.0初始 jdbc 来呈现 耦合的问题

Spring 大概起始于 2002 年的 interface21 的: 这是 Spring前身的一个主要的标志 9是j2EE 开发的, 抛弃了 不使用EJB

这次介绍的是Spring5.0 与 2017 年09月 发布的 通用 (GA)

Spring 都有那些优势#####

  几乎所有的框架 的趋势与共性 :  

解耦 与 简化开发的

   Spring通过 IOC  容器 来实现的
       IOC 里 将 Object 之间的 依赖关系   分别让Spring来管理 ,削减 了的硬编码的   单例模式  与 文件解析 。。。。。这些的   使我们 可以更多的专注于编程的应用

AOP 的面向切片

的 的 就像 生物实验 的 里的切片研究一样 ’
让oop 的实现功能 也已他送应付

声明 事务:灵活 提高开发的效率

方便程序的测试: 无需 容器的依赖

方便集成,整合了各种 框架的

Struts Hibemate Mybatise , Hessian Quartz 等)的直接支持

降低 JavaEE API 的使用难度

Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的
使用难度大为降低。
Java 源码是经典学习范例
Spring 的源代码:的学习的是我们最 应该的 修炼的 有很多 的 Java 设计模式灵活运用以
及对 Java 技术的高深造诣。它的源代码 是 Java 技术的最佳实践的范例

我要分享的是 与实现的## 标题

1:基于xml 的IOC 配置
2:基于注解annotation

言简意赅 之后 开始我的见习 得Spring
方便解耦 与简化开发 2:

工厂模式 : 工厂是 干什么的
JavaMail : 我们以前的时候 10行到20行 的代码 -----只用了Spring 只有4,5行

Spring 源码:刚开始还是建议少看这些 ----会很朦的》

在Spring 的体系结构#######

Spring体系结构-----------------------》
我们在官方的FRAMEWORK 框架骨架 doewnload里就能 先找到 Spring的坐标 在导入
今天的源码里 就有
libs 解压的时候 会有 framework runtime
官方 的 这张图的结构
底层上==
Core container: 核心容器(IOC)— 是 Spring任何 运行 基础 (的支持)
Beans Core:核心 Context: 上下文 SpEL:斯巴沙星
—接着就是 AOP 相关的内容:有4个 包括Messaging
—左上方的==Date Access/Integration:数## 标题据存取整合
==持久层
JDBC: ORM:相关 Transaction:事务 oxm jms — (网上查询)
—右上方的
web 相关的
servlet, web 熟悉吧 WebSocket Portlet — (网上查询)
后面的 springMVC , stusts
最底层的就是: 单元测试 Test

我们先要了解最重要的核心容器 IOC 概念–程序的耦合 ----解耦
下面 引用 一下介绍耦合的 分类
它有如下分类:
(1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另
一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
(2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大
量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
(3) 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传
递该全局变量的信息,则称之为外部耦合。
(4) 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进
行适当的动作,这种耦合被称为控制耦合。
(5)标记耦合 。若一个模块 A 通过接口向两个模块 B 和 C 传递一个公共参数,那么称模块 B 和 C 之间
存在一个标记耦合。
(6) 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形
式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另
一些模块的输入数据。
(7) 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实
现的。
总结:
耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须
存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
内聚与耦合
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从
功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件
结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通
过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之
间的相互依存度却要不那么紧密。
内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他
模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。

在开发中,有些依赖关系是必须的,有些依赖关系可以通过优化代码来解除的。下面的示例
-------这是一个账户 的Account
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao = new AccountDaoImpl();
}
上面的代码表示:
业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译
将不能通过。这种编译期依赖关系,应该在我们开发中杜绝。我们需要优化代码解决


—通过 JDBC 的 的代码 。。。

再比如:早期我们的 JDBC 操作,注册驱动时,我们为什么不使用 DriverManager 的 register 方法lass.forName 的方式?public class JdbcDemo1{
public static void main(String[] args) throws Exception {
//1.注册驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName(“com.mysql.jdbc.Driver”);
//2.获取连接
//3.获取预处理 sql 语句对象
//4.获取结果集
//5.遍历结果集
}
}
原因就是:
我们的类依赖了数据库的具体驱动类(MySQL),如果这时候更换了数据库品牌(比如 Oracle),需要
修改源码来重新数据库驱动。这显然不是我们想要的
}

解决程序耦合的思路

当是我们讲解 jdbc 时,是通过反射来注册驱动的,代码如下:
Class.forName(“com.mysql.jdbc.Driver”);//此处只是一个字符串

此时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除 mysql 的驱动 jar 包,依然可以编译(运
行就不要想了,没有驱动不可能运行成功的)。
同时,也产生了一个新的问题,mysql 驱动的全限定类名字符串是在 java 类中写死的,一旦要改还是要修改
源码。
解决这个问题也很简单,使用配置文件配置

工厂模式解耦

在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的
方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。
那么,这个读取配置文件,创建和获取三层对象的类就是工厂

我的分析-------------Spring将会解决的问题—编写JDBC 的演示程序的耦合-------》

演示程序的耦合;
引出的 现有代码问题: ------ 注意的是 类的依赖
一个案例 :

JDBCDemo01-----》耦合问题的

–用连接 数据库 -------》编译时期 的依赖 即耦合
package com.fhw.jdbc;

import java.sql.*;

/**

  • 程序的耦合

  • 数据库 里准备 库,表 :SQL语句

  • 减少依赖的方式 : 削减/减少

  • /DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 依赖具体的类/
    //使用反射: 解耦 新的问题 : 字符串 在类还是写死了 如换其他的数据库

    // Class.forName("com.mysql.jdbc.Driver");
    

public class JdbcDemo01 {
public static void main(String[] args) throws Exception {
// 注册驱动
/DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 依赖具体的类/
//使用反射: 解耦 新的问题 : 字符串 在类还是写死了 如换其他的数据库

    Class.forName("com.mysql.jdbc.Driver");//字符串的方式   加上依赖:maven 的mysql 的依赖 解决了类 的依赖
    //获取连接
    Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/ffff","root","root");
    //获取操作数据库的预处理对象
    PreparedStatement pstm=con.prepareStatement("select *from account");
    //执行数据库
    ResultSet rs = pstm.executeQuery();

    //遍历击结果
    while (rs.next()){// 从表头 的 到 表的内容 next()
         System.out.println(rs.getString("name"));;
    }
    //释放资源
    pstm.close();
    con.close();

}

}

maven 的pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>com.fhw</groupId>
<artifactId>fhw01_01JDBC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version> 5.1.6</version>
    </dependency>
</dependencies>
类的依赖===》 new com.mysql.jdbc.Driver() 我们的maven坐标这是没有 SQL的依赖() 我们用 这些类 换成 字符串的注册驱动forName() compilation with 加上===maven坐标这是 SQL的依赖() 注册驱动forName(字符串)就写死了 ===》这是新的问题 解耦的思路: :----------------------------------》 1: 反射 来创建对象 避免 使用new 2: 通过读取配置文件 要创建的对象全限定类名 总结:反射 来解耦-----》与配置文件

编译期依赖---------------------》
我们解决: 经常要用的 放在在我们的pom依赖
依赖是 需要降低 就能 增加独立自主—》具体的是: 编译时不依赖 执行时再依赖

曾经代码中的问题分析-----------------------------》
模拟一下:
创建新的module:-----》 接口
这些都是 之前做过的 实现类 多态new的现象 就是要避免 和 解耦的 可以用的 优化
业务层 在调用 持久层 也在 表现层 到 持久层 都会共有的 问题s
我们maven的坐标啊 地方就是 jar 的方式 (没有坐标的)没有浏览器与web

在模拟一个表现层 (实际里这里就是一个 servlet)

我们呈现 了好多的依赖 这就是我们要解决的!

之前的代码L我们----综合案例–》regist-- 我们通过 发送邮件 那么 要换的是 短信呢?
我们要改的是 ===》二期开发(尽量不修改)
我们再 写一个UserService 实现类

javaBean:
实体类仅仅 是指
解耦:
反射 + 配置文件 + Factory工厂模式
其实 我们的之前用过的 反射 + 配置文件 +工具类 ,工具类就类似 工厂模式
-------- 解决 降低的依赖-- 编写工厂类和配置文件 ---------==================》
Bean.prorperties:
在static代码块 里 定义了 读取 配置文件 的数据-----》立即加载
现在解耦了吗: Service里依赖 具体的实现类 模拟的servlet 依赖于 Service
在改造: 消减new 就是减依赖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值