spring的设计思想

在学习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

原文地址:https://www.cnblogs.com/zjulanjian/p/10929976.html

时间: 2024-10-09 14:32:30

spring的设计思想的相关文章

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

前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性).在实际开发中,我们对事务应用最多就是在数据库操作这一环,特别是Spring对数据库事务进行了封装管理.Spring对事务的支持,确实很强大,但是从本质上来讲:事务是否生效取决数据库底层是否支持(比如MySQL的MyISAM引擎就不支持事务,Spring能奈何!),同时一

《Spring设计思想》AOP实现原理(基于JDK和基于CGLIB)

0.前言 在上篇文章<Spring设计思想>AOP设计基本原理中阐述了Spring AOP 的基本原理以及基本机制,本文将深入源码,详细阐述整个Spring AOP实现的整个过程. 读完本文,你将了解到: 1.Spring内部创建代理对象的过程 2.Spring AOP的核心---ProxyFactoryBean 3.基于JDK面向接口的动态代理JdkDynamicAopProxy生成代理对象 4.基于Cglib子类继承方式的动态代理CglibAopProxy生成代理对象 5.各种Advice

spring事务管理器设计思想(一)

首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 1.堆栈中存储值类型 2.堆栈实际上是向下填充,即由高内存地址指向低内存地址填充 3.堆栈的工作方式是先分配内存的变量后释放(先进后出原则) 4.堆栈中的变量是从下向上释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突 5.堆栈的性能非常高,但是对于所有的变量来说还不灵活,而且变量的生命周期必须嵌套. 6.通常我们希望使用一种方法分配内存来存储数据,并且方法退出后很长一段时间内

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

0.前言 Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Spring AOP. 读完本文,你将了解到: 1.    Java程序执行在JVM中的特征 2.    Java程序的运行流[了解AOP.连接点(Join Point).切入点(point cut)   的概念 ] 3.    引入了代理模式的Java程序运行流(AOP实现的机制) 4.    Spr

Spring MVC 设计架构思想

在整个Spring设计思想中,切面模块思想十分重要. 在Spring MVC Controller中是面向Model编程的. 不管是Cookie,Session,或是postData 都会被转换成Models, 最后,Models也会根据注解被自动转换为 Cookie, Session,  或者页面.

spring入门篇2 --- IOC设计思想

在上一篇中已经大致了解了IOC的设计思想,IOC全拼是Inversion of Control,就是控制反转,以前我们都是自己创建对象,进行实例化,现在交给框架spring来进行控制,以实现高度的解耦. IOC是设计思想,是Spring的核心,我们必须要掌握,因此通过几个例子,来看看到底是如何实现的,这样就可以有更清晰的认知,所有的demo源码放在了github上,后续学习过程会进行持续的更新,以后不再赘述. 学习这个之前,我们需要了解一下什么是DI,Dependency Injection,依

中文翻译为&quot;具象状态传输&quot;的RESTful的架构风格和设计思想

本文标签:  具象状态传输 RESTful架构 RESTful理解 REST   服务器 REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态.所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计.在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现. REST(Representational State Transfer ),有中文翻译为"具象状态传

框架源码系列一:设计模式(设计思想、设计原则、各种设计模式介绍、设计模式总结)

要分析常用框架spring.mybatis.springboot.springcloud等的源码,首先要了解各种设计模式,因为框架里面应用了各种设计模式 一.设计思想 学习设计模式最重要的是掌握设计思想和设计原则,理解了设计思想和设计原则并运用到平时的编码中是最重要的!!! 1. 我们先来看下面的问题: 天天加班编程,编程到底都做的是什么? 撸代码,加班撸代码,写接口.写类.写方法 用设计模式或做设计的作用是什么? 指导.规定该如何撸代码,如何来写接口.写类.写方法 为什么要做设计.用设计模式?

作业01的设计思想、程序流程图、源代码、结果截图

一.设计思想: 1.读入类型为String的参数,并且进行显示: 2.然后进行强制类型转化,将String类型转化为int类型: 3.然后各个参数相加: 4.输出最后的结果: 二.流程图: 三.源代码: package demo; public class sum { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println