框架前奏

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 框架前奏

框架前奏

穿插之前的JAVAWEB项目,之后的Spring框架。

JAVAWEB项目:用到技术点

  • MVC模式
  • 数据库连接技术(JDBC)
  • 分层思想

1.先创建JAVAWEB项目(IDEA)

使用tomcat,配置运行一下

2.src下的目录

某新闻系统,主题为例,Topic

搭建框架

  • com.aaa.dao:数据访问层的包
  • com.aaa.dao.impl:数据访问层接口的实现类
  • com.aaa.service:业务层的包,主要放业务层接口
  • com.aaa.service.impl:业务层包的实现类:主要放业务层接口实现类
  • com.aaa.controller:Servlet,去调用业务层的接口及其实现类。

controller是之前的写法,今天的测试,换成了一个test包,在test包下建立一个test类,来测试业务层接口及其实现类。

这个其实和使用servlet测试是一样。

刚才我们讲了,搭建。在控制台做了测试输出。

3.setter解耦

数据库mysql,oracle

有mysql的数据访问层的实现,有oracle的数据访问层的实现。

业务层,这里实现的是TopicDaoMysqlImpl,针对的mysql数据库的操作。

我们现在的操作都变了,要去操作oracle数据库。怎么办呢???

TopicDao topicDao=new TopicDaoMysqlImpl();

代码改变:

TopicDao topicDao=new TopicDaoOracleImpl();

运行之后,可以看到,会改变为删除oracle数据库中的主题编号:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKiyCtrG-1591145306194)(E:\政通路\课堂笔记\S2\Spring\assets\image-20200601163742411.png)]y

大家要总结一下,当我们的数据库变更的时候,这样操作的方式好不好呢???

假如说,我们的项目已经部署上线了,项目在运行,你来改变代码来了。不能说肯定会出现问题,但是出现问题的几率一定是比较大。

能不能有一种方式,由客户自己来决定变更使用哪种数据库或者是客户自己决定某种操作。

这种问题,其实就是程序的耦合问题。

之前学习过OOP,三大特征:封装、继承、多态。

要实现的目标是:高内聚、低耦合、高复用

我们在写程序的时候,尽量低耦合。不new具体的对象;

重点代码:

package com.aaa.service.impl;
import com.aaa.dao.TopicDao;
import com.aaa.dao.impl.TopicDaoMysqlImpl;
import com.aaa.dao.impl.TopicDaoOracleImpl;
import com.aaa.service.TopicService;
/**
 * Created by 张晨光 on 2020/6/1 16:19
 * 主题业务层的实现类;java程序员 调用dao层,不改.
 * 调用dao层的接口及其实现;
 */
public class TopicServiceImpl implements TopicService {
    //定义dao层对象,及其实现类;
    //TopicDao topicDao=new TopicDaoMysqlImpl();
     //TopicDao topicDao=new TopicDaoOracleImpl();
    //这种方式:是通过new 出来dao层对象的具体的实现类。
    //能不能有一种方式,交由客户自己来调用的时候来实现呢???
    //尽量少的动代码;
    //这种其实就是程序之间的耦合问题。
    //********************松耦合的实现************
    TopicDao topicDao;
    //创建它的getter/setter
    public TopicDao getTopicDao() {
        return topicDao;
    }
    //重点看这个:参数是一个TopicDao的对象;
    public void setTopicDao(TopicDao topicDao) {
        this.topicDao = topicDao;
    }
    @Override
    public void deleteTopicById(Integer id) {
        //在方法里面,通过dao层对象去执行删除操作;
        //注意看:这里面有topicDao的对象的new ???没有了
        topicDao.deleteTopicById(id);
    }
}

客户端的使用:

TopicService topicService=new TopicServiceImpl();
        //在业务层实现类代码里面,已经没有了new TopicDaoOracleImpl的代码,我们的目标就是去掉这个
        //代码,实现松耦合
        //通过setter来实现
        //((TopicServiceImpl) topicService).setTopicDao(new TopicDaoOracleImpl());
        //客户变更为了mysql
        ((TopicServiceImpl) topicService).setTopicDao(new TopicDaoMysqlImpl());
        //由原来在业务层实现类的具体的new xxxImpl,交由客户端test类自动选择,我要new。
        //
        topicService.deleteTopicById(3);//模拟实现;

总结:

  • 耦合度:模块间的耦合度是指模块之间的依赖关系;java里面的耦合度指的是类、接口、实现之间的关联程度。
  • 解耦:通过把创建接口对象的setter()方法,在客户端由客户决定哪种数据库的使用。
  • 高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合)
  • 之前的数据库连接代码,放在了BaseDao里面,是写死的,需要修改也得改代码。可以放在db.properties配置文件,也是解耦的一种表现。

作业:

  • 使用UserDao来解耦之前JAVAWEB代码,模仿TopicDao。

—************

首先是熟练操作IDEA,创建WEB项目,使用tomcat,配置、部署运行等。

复习:

面向对象的目标:高内聚、低耦合、高复用

原来JAVAWEB项目存在高耦合的情况,我们要解耦,我们使用的接口对象的setter()方法进行解耦操作。

4.解耦方式二

程序的耦合

耦合:程序间的依赖关系,包括:

a.类之间的关系

b.方法间的关系

解耦:降低程序间的依赖关系

为bug生,为bug死,为bug奋斗终生

为解耦生,为解耦死,为解耦奋斗终生–》只要项目你不断完善,就存在类、方发、模块、项目之间的耦合度。

实际开发中:

应该做到,编译时不依赖,运行时依赖

解耦的思路:

第一步:使用反射来创建对象,而避免使用new关键字。Class.forName("")

第二步:通过读取配置文件来获取要创建的对象全限定类名。xxx.properties/xxx.xml文件

使用xml文件的解耦,这个将来和spring框架会联系起来,将我们的技术串起来。以听为主,不用记忆。

1.在src下建立beans.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <!--beans:指的所有bean的集合,使用xml文件进行解耦-->
    <!--bean:单个bean的配置文件;id:bean的编号;class:bean路径-->
    <!--class:mysql下数据库的实现类;给这个类起id名topicDaoMysqlImpl-->
    <bean id="topicDaoMysqlImpl" class="com.aaa.dao.impl.TopicDaoMysqlImpl"></bean>
    <!--topicServiceImpl解耦-->
    <bean id="topicServiceImpl" class="com.aaa.service.impl.TopicServiceImpl"></bean>
</beans>

bean:咖啡豆;在java 组件

JAVABEAN:指的就是JAVA里面的可重用组件,玩具:可以由若干零部件组成,组件(组成的零件),在JAVA里面,业务层的接口、接口的实现类、dao层接口、dao层接口的实现类,可以被多次调用(被重用),这些被重用的类、接口都是JAVABEAN。

JAVABEAN的范围远大于实体类,实体类仅仅指的是业务传递数据时的一种重用形态。

2.建立BeanFactory类,操作xml文件

2.1 jar包准备

IDEA的web-INF创建,lib目录,然后把xml的jar放进去,然后Add as Library

2.2 使用BeanFactory来获取bean
package com.aaa.util;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * Created by 张晨光 on 2020/6/2 15:01
 * Bean:重用组件;--》JAVABEAN;
 * Factory:工厂的意思;BeanFactory:Bean的工厂;
 * 顾名思义:批量创建Bean;操作beans.xml文件,创建bean
 */
public class BeanFactory {
    //定义静态方法根据id来获取Bean对象;
    public static Object getBean(String id){
        //用类加载器解析xml文件
        try {
            SAXReader reader = new SAXReader(); //xml的reader对象
            //getClassLoader():类加载器,getResourceAsStream:将资源加载为流;
            Document document = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
            //xpath技术获得bean元素;相当于之前js:document.getElementById("id")
            Element element = (Element) document.selectSingleNode("//bean[@id='"+id+"']");
            //拿到class属性里面的值
            String value = element.attributeValue("class");
            //获得反射对象
            System.out.println(value);
            //通过类的全限定名加载类对象[包名+类名];得到value类的class(TopicDaoMysqlImpl):它的类信息;
            //是不是可以想到:Class.forName("com.mysql.cj.jdbc.Driver")
            Class clazz = Class.forName(value);
            //获得实例
            return clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}

3.测试类

//2.1通过BeanFactory来获取一下;
        TopicService topicService = (TopicService) BeanFactory.getBean("topicService");
        //2.直接调用即可
        topicService.deleteTopicById(2);

总结:

1.通过建立配置文件xml解耦

`

3.测试类

//2.1通过BeanFactory来获取一下;
        TopicService topicService = (TopicService) BeanFactory.getBean("topicService");
        //2.直接调用即可
        topicService.deleteTopicById(2);

总结:

1.通过建立配置文件xml解耦

2.建立BeanFactory解析xml文件,使用反射机制来读取类信息,创建类实例,实现自动创建对象的操作。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
开发框架 小程序 前端开发
带你了解小程序的框架之谜
带你了解小程序的框架之谜
|
5月前
|
存储 Java 关系型数据库
“代码界的魔法师:揭秘Micronaut框架下如何用测试驱动开发将简单图书管理系统变成性能怪兽!
【9月更文挑战第6天】Micronaut框架凭借其轻量级和高性能特性,在Java应用开发中备受青睐。本文通过一个图书管理系统的案例,介绍了在Micronaut下从单元测试到集成测试的全流程。首先,我们使用`@MicronautTest`注解编写了一个简单的`BookService`单元测试,验证添加图书功能;接着,通过集成测试验证了`BookService`与数据库的交互。整个过程展示了Micronaut强大的依赖注入和测试支持,使测试编写变得更加高效和简单。
104 4
|
6月前
|
Rust 开发者
揭秘Rust编程:模块与包的终极对决,谁将主宰代码组织的新秩序?
【8月更文挑战第31天】在软件工程中,模块化设计能显著提升代码的可读性、可维护性和可重用性。Rust 作为现代系统编程语言,其模块和包管理机制为开发者提供了强有力的工具来组织代码。本文通过对比模块和包的概念及使用场景,探讨了 Rust 中的最佳实践。
76 2
|
5月前
|
设计模式 网络协议 网络架构
软件工程师,学会封装不香么
软件工程师,学会封装不香么
46 0
|
6月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
75 0
|
6月前
|
开发者 CDN 监控
【破局·提速】当Vaadin遇上性能怪圈:开发者的智慧较量与极速加载的实战秘籍!
【8月更文挑战第31天】本文详细介绍了优化Vaadin应用性能的方法,特别是提高加载速度的实战技巧。首先分析性能瓶颈,如服务器响应时间和数据库查询效率等;然后通过代码优化、数据分页与急切加载技术减少资源消耗;接着利用资源压缩合并及CDN加速,进一步提升加载速度;最后通过持续性能监控和测试确保优化效果。通过综合应用这些策略,可显著改善用户体验。
110 0
|
9月前
|
存储 Java
Java语法掌握:打好编程基础的关键(一)
Java语法掌握:打好编程基础的关键
48 0
Java语法掌握:打好编程基础的关键(一)
|
9月前
|
存储 人工智能 搜索推荐
Java语法掌握:打好编程基础的关键(三)
Java语法掌握:打好编程基础的关键
49 0
|
9月前
|
存储 安全 Java
Java语法掌握:打好编程基础的关键(二)
Java语法掌握:打好编程基础的关键
88 0
|
编译器 程序员 C语言
游戏编程之二 windows编程基础
游戏编程之二 windows编程基础
103 0