在学习Spring框架的时候, 第一件事情就是分析Spring的设计思想

在学习Spring的时候, 需要先了解耦合和解耦的概念

耦合: 简单来说, 在软件工程当中, 耦合是指对象之间的相互依赖

耦合的坏处: 耦合提升了代码的复杂度, 不利于开发和维护, 低耦合是软件系统架构设计的原则之一

为什么需要Spring?

Spring能够统一的管理bean对象, 当需要什么对象, 我们就去从Spring中获取对应的对象, 而不再需要去new新建出来, 大大的简化了对象的管理(创建, 调用和配置文件的读取)等工作!

Spring解决了耦合问题, 降低了对象之间的相互依赖关系

Spring解决了什么问题?

简单来说,就是处理对象的创建的、以及对象的依赖关系!

Spring的基本实现思路是什么样的?

1.第一步, 最原始的, 使用new()方法来创建对象

不足: 这导致了程序的高耦合性, 如果需要新建的对象还没有被实现, 那么就会报错, 不能进行后续的开发, 同时程序在编译时会报错. 有悖于软件架构设计的低耦合原则, 和单一功能原则.

  // 1. 程序有强耦合关系: 使用mysql驱动的时候, 使用Driver类的对象
@Test
public void test1() {
try {
// 创建了一个Driver对象
// 使用registerDriver来添加mysql驱动到驱动管理器中
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
} catch (SQLException e) {
e.printStackTrace();
}
}

2. 第二步, 反射 例如: Class.ForName("com.mysql.jdbc.Driver").newInstance()

  通过反射机制, 在程序运行的时候, 来将需要的类进行加载并创建类的对象

   // 2. 把代码中的强关系, 转换为了弱关系
String driver = "com.mysql.jdbc.Driver";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

3. 第三步, 配置 例如: db.properties和web.xml

 通过配置文件, 在程序运行的时候, 读取配置文件中的内容, 通过配置文件来加载类, 并创建类的实例

 /**
* 通过配置文件来实现解耦
*/
@Test
public void test3() {
// db.properties文件位置在src下
// 编译完成后, src目录下的配置文件会拷贝一份到classes目录
ClassLoader classLoader = TestMySQL.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("db.properties");
Properties properties = new Properties();
try {
properties.load(resourceAsStream);
System.out.println(properties.get("driver"));
String driver = (String)properties.get("driver");
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

4. 第四步, 通过Bundle来加载配置文件,简化配置文件的加载过程, 然后创建出对象

  // 使用bundle
@Test
public void test4() {
// ResourceBundle是专门用来读取配置文件的工具类
// bundle只能读取properties类型的文件, 读取的时候只需要文件名, 不需要后缀
// bundle还提供了迭代的方法读取所有配置
ResourceBundle db = ResourceBundle.getBundle("db");
db.getString("driver");
Enumeration<String> keys = db.getKeys();
while(keys.hasMoreElements()) {
String key = keys.nextElement();
System.out.println(key +": " + db.getString(key));
}
}

5. 第五步, 通过Bean工厂来管理所有的类的对象的管理, 直接从Bean工厂中获取对象

public class BeanFactory {

    // 在bean的工厂中准备一个容器,将bean都反射后添加进来,随用随取
private static Map<String,Object> beanMap = null;
static {
beanMap = new HashMap<>();
ResourceBundle bean = ResourceBundle.getBundle("bean");
Enumeration<String> keys = bean.getKeys();
while(keys.hasMoreElements()) {
String key = keys.nextElement();
String classPath = bean.getString(key);
try {
Object object = Class.forName(classPath).newInstance();
beanMap.put(key,object);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 使用Object的基础类来接受获取的对象
* @param key
* @return
*/
public static Object getBean(String key) {
Object o = null;
ResourceBundle bean = ResourceBundle.getBundle("bean");
String classPath = bean.getString(key);
try {
o = Class.forName(classPath).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return o;
} /**
* 使用泛型方法来获取对象(推荐)
* @param key
* @param clazz
* @param <T>
* @return
*/
public static<T> T getBean(String key, Class<T> clazz) {
return (T) beanMap.get(key);
}

那么再程序中对新建对象的调用就变成了如下的代码

        UserService userService = BeanFactory.getBean("userService", UserService.class);
userService.register(user);

Spring的核心思想:

  就是通过一个BeanFactory的工厂来统一管理所有的对象

在bean的工厂中准备一个容器,将bean都反射后添加进来,随用随取

参考文章: https://www.cnblogs.com/hello-liyb/p/8252029.html

https://blog.csdn.net/weixin_37243717/article/details/79673502

https://www.cnblogs.com/poilk/p/7015929.html

https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/

https://www.cnblogs.com/wade-luffy/p/6000277.html

spring的设计思想的更多相关文章

  1. 透彻理解Spring事务设计思想之手写实现

    前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...

  2. 透彻理解Spring事务设计思想之手写实现(山东数漫江湖)

    前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...

  3. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  4. spring事务管理器设计思想(2)

    spring事务管理器设计思想(二) 上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当 ...

  5. MyBatis 强大之处 多环境 多数据源 ResultMap 的设计思想是 缓存算法 跨数据库 spring boot rest api mybaits limit 传参

    总结: 1.mybaits配置工2方面: i行为配置,如数据源的实现是否利用池pool的概念(POOLED – This implementation of DataSource pools JDBC ...

  6. 《Spring设计思想》AOP设计基本原理

    0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Sp ...

  7. Spring5源码分析(1)设计思想与结构

    1 源码地址(带有中文注解)git@github.com:yakax/spring-framework-5.0.2.RELEASE--.git Spring 的设计初衷其实就是为了简化我们的开发 基于 ...

  8. spring最核心思想--ioc控制反转

    一核心概念 控制反转:将bean的生成交给容器,程序可以从容器中获取指定的bean. 个人理解:此优势也是spring能够流行并成为java主流框架的主要原因,java是帮助java程序员以对象的方式 ...

  9. spring boot编程思想(核心篇) pdf 下载 it教程

    资料简介:本书是<Spring Boot 编程思想>的核心篇,开篇总览Spring Boot核心特性,接着讨论自动装配(Auto-Configuration)与SpringApplicat ...

随机推荐

  1. Eclipse 插件管理

    查看已安装的插件: [help]⇒ [About Eclipse]⇒ [Installed Softwares] 1. 常用插件 maven:安装步骤如下: [help]⇒ [Install new ...

  2. E20180128-hm

    paradigm  n. 范例,样式,模范; 词形变化表; outlet  n. 出口,出路; 批发商店; 排水口,通风口; 发泄(情感)的方法;

  3. 景女神与她的托福(BFS+状压)

    景女神与她的托福 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submis ...

  4. Docker+Jenkins+Git发布SpringBoot应用

    Doccker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之 ...

  5. c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序

    零散知识点: 非格式化输入输出:getchar().putchar() 格式化输入输出   :scanf().printf() 字符串输入输出   :gets() 或 scanf().puts() 或 ...

  6. SetViewportOrgEx(视口) 与 SetWindowOrgEx(窗口) 解析

    SetViewportOrgEx (hdc,x/2,y/2) 视口中心点设置到窗口中心 获取客户群x和y,x/2,y/2 ,这样中心点就到窗口中间了. SetWindowOrgEx(hdc,-x/2, ...

  7. cmdb客户端服务器信息采集一

    #cmdb脚本程序一 #!/usr/bin/python # coding:utf-8 """ 采集机器自身信息 1 主机名 2 内存 3 ip与mac地址 4 cpu信 ...

  8. DP(递归打印路径) UVA 662 Fast Food

    题目传送门 题意:n个饭店在一条直线上,给了它们的坐标,现在要建造m个停车场,饭店没有停车场的要到最近的停车场,问所有饭店到停车场的最短距离 分析:易得区间(i, j)的最短距离和一定是建在(i + ...

  9. ZooKeeper通过ACL修复未授权访问漏洞

    默认情况下ZooKeeper允许匿名访问,因此在安全漏洞扫描中暴漏未授权访问漏洞. 一.参考资料 <ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表& ...

  10. 用C#操作word替换字符,用spire

    这两天想写个小程序,是用C#操作word文档的.许多人都对微软本身的解决方案COM组件十分不看好,比如需要本机安装office等等,总之吐槽很多,直接放弃. 搜到一个国产的npoi库,据说操作简单功能 ...