文章目录
1.耦合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYEWuHqy-1628921899188)(D:\Typora\图片\Spring图标.png)]
Spring框架是 Java 平台的一个开源的全栈(Full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。该框架的一些核心功能理论上可用于任何 Java 应用,但 Spring 还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。虽然 Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了企业级JavaBeans(EJB)模型 —— 维基百科
耦合,就是模块间关联的程度,每个模块之间的联系越多,也就是其耦合性越强,那么独立性也就越差了,所以我们在软件设计中,应该尽量做到高内聚,低耦合!!
高内聚与低耦合是每个软件开发者追求的目标,那么内聚和耦合分别是什么意思呢?
内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
生活中的例子:家里有一条串灯,上面有很多灯泡,如果灯坏了,你需要将整个灯带都换掉,这就是高耦合的表现,因为灯和灯带之间是紧密相连,不可分割的,但是如果灯泡可以随意拆卸,并不影响整个灯带,那么这就叫做低耦合!
代码中的例子:来看一个多态的调用,前提是B继承 A,引用了很多次
A a = new B(); // 父类引用 指向子类对象 里式替换原则
a.method();
A a = new C(); // 父类引用 指向子类对象 里式替换原则
a.method();
重新编译 Web源码---打包war--->编译class---->上线部署!
如果你想要把B变成C,就需要修改所有new B()
的地方为 new C()
这也就是高耦合
A a = BeanFactory().getBean(B名称); // B名称 ---->可以写到配置文件中!! .perperties .xml
a.method();
这个时候,我们只需要将B名称改为C,同时将配置文件中的B改为C就可以了.
2.分析耦合及改进
首先,我们简单的模拟一个对账户进行添加的操作,我们先采用我们以前常常使用的方式进行模拟,然后再给出改进方案,再引出今天要将的 Spring 框架,能帮助更好的理解这个框架!
2.1.以前的程序
首先,按照我们常规的方式先模拟,我们先将一套基本流程走下来!
A:Dao 层
/**
* 账户持久层接口
*/
public interface AccountDao {
void addAccount();
}
/**
* 账户持久层实现类
*/
public class AccountDaoImpl implements AccountDao {
public void addAccount() {
System.out.println("添加用户成功!");
}
}
B:Service 层
/**
* 账户业务层接口
*/
public interface AccountService {
void addAccount();
}
/**
* 账户业务层实现类
*/
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao = new AccountDaoImpl();
public void addAccount() {
accountDao.addAccount();
}
}
C:调用
由于,我们创建的Maven工程并不是一个web工程,我们也只是为了简单模拟,所以在这里,创建了一个 Client 类,作为客户端,来测试我们的方法
public class Client {
public static void main(String[] args) {
AccountService as = new AccountServiceImpl();
as.addAccount();
}
}
运行的结果,就是在屏幕上输出一个添加用户成功的字样
D:分析:new 的问题
上面的这段代码,应该是比较简单也容易想到的一种实现方式了,但是它的耦合性却是很高的,其中这两句代码,就是造成耦合性高的根由,因为业务层(service)调用持久层(dao),这个时候业务层将很大的依赖于持久层的接口(AccountDao)和实现类(AccountDaoImpl)
private AccountDao accountDao = new AccountDaoImpl();
AccountService as = new AccountServiceImpl();
这种通过 new 对象的方式,使得不同类之间的依赖性大大增强,其中一个类的问题,就会直接导致出现全局的问题,如果我们将被调用的方法进行错误的修改,或者说删掉某一个类,执行的结果就是:
在编译期就出现了错误,而我们作为一个开发者,我们应该努力让程序在编译期不依赖,而运行时才可以有一些必要的依赖(依赖是不可能完全消除的)
所以,我们应该想办法进行解耦,要解耦就要使调用者和被调用者之间没有什么直接的联系,那么工厂模式就可以帮助我们很好的解决这个问题.
应该大家在 JavaWeb 或者 JavaSE的学习中,或多或少是有接触过工厂这个设计模式的,而工厂模式,我们简单提一下,工厂就是在调用者和被调用者之间起一个连接枢纽的作用,调用者和被调用者都只与工厂进行联系,从而减少了两者之间直接的依赖(如果有一些迷茫的朋友,可以了解一下这种设计模式)
传统模式:
工厂模式:
2.2.工厂模式改进
A:BeanFactory
具体怎么实现呢?在这里可以将 serivice 和 dao 均配置到配置文件中去(xml/properties
),通过一个类读取配置文件中的内容,并使用反射技术创建对象,然后存起来,完成这个操作的类就是我们的工厂!
注:在这里我们使用了 properties ,主要是为了实现方便,xml还涉及到解析的一些代码,相对麻烦一些,不过我们下面要说的 Spring 就是使用了 xml做配置文件
- bean.properties:先写好配置文件,将 service 和 dao 以 key=value 的格式配置好
accountService=cn.ideal.service.impl.AccountServiceImpl