框架前奏

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

框架前奏

穿插之前的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
目录
相关文章
|
开发框架 小程序 前端开发
带你了解小程序的框架之谜
带你了解小程序的框架之谜
|
3月前
|
存储 Java 关系型数据库
“代码界的魔法师:揭秘Micronaut框架下如何用测试驱动开发将简单图书管理系统变成性能怪兽!
【9月更文挑战第6天】Micronaut框架凭借其轻量级和高性能特性,在Java应用开发中备受青睐。本文通过一个图书管理系统的案例,介绍了在Micronaut下从单元测试到集成测试的全流程。首先,我们使用`@MicronautTest`注解编写了一个简单的`BookService`单元测试,验证添加图书功能;接着,通过集成测试验证了`BookService`与数据库的交互。整个过程展示了Micronaut强大的依赖注入和测试支持,使测试编写变得更加高效和简单。
87 4
|
4月前
|
JavaScript 前端开发 数据挖掘
【幕后揭秘】Tornado框架何以称霸?带你一探究竟,解锁Web开发新潮流的秘密武器!
【8月更文挑战第31天】Tornado 是一款用 Python 编写的高性能非阻塞网络框架,以其处理大量并发连接的能力著称,适用于实时 Web 应用。它最初由 FriendFeed 开发并开源,现已广泛应用于多种场景。Tornado 的核心优势在于异步 I/O 处理机制,可在单线程内处理数万并发连接,非常适合实时应用如在线聊天、游戏等。本文将详细介绍 Tornado 的核心特点,并通过具体示例代码展示其在实际项目中的应用,帮助读者理解 Tornado 如何引领 Web 开发新潮流。
43 0
|
4月前
|
开发者 CDN 监控
【破局·提速】当Vaadin遇上性能怪圈:开发者的智慧较量与极速加载的实战秘籍!
【8月更文挑战第31天】本文详细介绍了优化Vaadin应用性能的方法,特别是提高加载速度的实战技巧。首先分析性能瓶颈,如服务器响应时间和数据库查询效率等;然后通过代码优化、数据分页与急切加载技术减少资源消耗;接着利用资源压缩合并及CDN加速,进一步提升加载速度;最后通过持续性能监控和测试确保优化效果。通过综合应用这些策略,可显著改善用户体验。
86 0
|
4月前
|
Java 数据库连接 Spring
Struts 2 插件开发竟如魔法盛宴,为框架注入超能力,开启奇幻编程之旅!
【8月更文挑战第31天】在Web开发中,Struts 2插件开发允许我们在不改动框架核心代码的前提下,通过创建实现特定接口的Java类来扩展框架功能、调整其行为或促进与其他框架(如Spring、Hibernate)的集成,从而更好地满足特定业务需求。遵循良好的设计原则与实践,能够确保插件的高效稳定运行并提升整体项目的可维护性。具体步骤包括创建项目、定义插件类、实现初始化与销毁逻辑,并将插件部署至应用中。
62 0
|
4月前
|
前端开发 开发者 Python
Flask框架之谜:如何用Blueprints神技轻松制胜模块化应用?
【8月更文挑战第31天】随着Flask应用规模扩大,代码管理和模块化变得至关重要。Blueprints作为Flask提供的强大工具,支持将应用分割成包含独立路由、视图、模板和静态文件的模块,从而提高代码清晰度与重用性。本文通过创建前端和后台管理两个蓝图的示例,展示了如何在Flask中使用Blueprints实现应用模块化,简化大型应用开发与维护工作,提升代码结构的清晰度及团队协作效率。
39 0
|
4月前
|
开发者 前端开发 Apache
【绝不错过!】揭秘Wicket大神级插件,带你飞越编程极限,探索Web应用开发新大陆!
【8月更文挑战第31天】Apache Wicket是一个成熟的Java Web框架,以其组件化体系结构、直观的API及对MVC的支持著称。其活跃社区贡献了大量插件和扩展,显著提升了Wicket的功能性。本文推荐几个实用插件,如**Wicket Ajax Support**,可轻松添加Ajax功能,提升用户体验;**Bootstrap for Wicket**则将Bootstrap与Wicket结合,美化应用界面。
47 0
|
XML 存储 Java
万字+40张图带你探秘小而美的规则引擎框架LiteFlow
在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。时间一长,项目几经易手,维护的成本就会越来越高。各种硬代码判断,分支条件越来越多。代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现。
|
编译器 程序员 C语言
游戏编程之二 windows编程基础
游戏编程之二 windows编程基础
83 0
|
存储 编解码 API
游戏编程之四 diectxdarw基础篇
游戏编程之四 diectxdarw基础篇
70 0