Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring?

spring是一个开源轻量级的java开发应用框架,可以简化企业级应用开发

  • 轻量级

1.轻量级(对于运行环境没有额外要求)

2.代码移植性高(不需要实现额外接口)

  • JavaEE的解决方案

        Spring更像是一种解决方案,对于控制层,它有Spring MVC,对于Service层,有对应的Aop可以解决service中的事务控制和日志处理的问题,现有的持久化方案像jdbc、mybatis作整合解决Dao的问题。最大的特点就是每个层次都可以有对应的解决方案。

2.设计模式

1.广义概念   

面向对象设计中,解决特定问题的经典代码

2.狭义概念

GOF4人定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板等

3.工厂设计模式 

        3.1什么是工厂设计模式

1.概念:通过工厂类、创建对象

        User user=new User()

        UserDao userDao=new UserDaoImpl();

2.好处:解耦合

        耦合:指定是代码间的强关联的关系,一方的改变会影响到另一方

        问题:不利于代码维护

        简单理解:把接口的实现类,硬编码在程序中

  • 通过建立工厂的方式和反射机制创建对象 解耦合
    public class BeanFactory {
        /*
            对象创建的方式
            1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
            2.通过反射的形式 创建对象 解耦合
                Class clazz=CLass.forName("basic.UserServiceImpl");
                UserService userService=(UserService)clazz.newInstance();
         */
        public static UserService getUserService() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            Class clazz=Class.forName("basic.UserServiceImpl");
            UserService userService=(UserService)clazz.newInstance();
            return userService;
        }
    }

 通过创建工厂和反射机制的方式创建对象,可以解耦合,减少代码的关联性,可以发现,Class.forName(字符串)可以通过配置文件的方式解耦合,这样代码发生变化时,仅仅只需要更改配置文件中的值。

package basic;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class BeanFactory {
    /*
        对象创建的方式
        1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
        2.通过反射的形式 创建对象 解耦合
            Class clazz=CLass.forName("basic.UserServiceImpl");
            UserService userService=(UserService)clazz.newInstance();
     */
    private static Properties properties;
    static{
        //仅仅需要加载一次 读取application.properties文件
        //第一步回去输入流
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/application.properties");
        //第二部 文件内容封装到Properties
        properties = new Properties();
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    public static UserService getUserService() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class clazz=Class.forName(properties.getProperty("userService"));
        UserService userService=(UserService)clazz.newInstance();
        return userService;
    }
}

         该方法通过读取配置文件的方式,对字符串进行解耦合。如果我们在创建一个UserDao的方式也解决了耦合,但是会发现,当我有一个对象需要解耦合,我们就要提供一个对应的方法。我们希望能够设计一个通用工厂的方式。

     配置文件展示

package basic;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
    /*
        对象创建的方式
        1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
        2.通过反射的形式 创建对象 解耦合
            Class clazz=CLass.forName("basic.UserServiceImpl");
            UserService userService=(UserService)clazz.newInstance();
     */
    private static Properties properties;
    static{
        //仅仅需要加载一次 读取application.properties文件
        //第一步回去输入流
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/application.properties");
        //第二部 文件内容封装到Properties
        properties = new Properties();
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
//    public static UserService getUserService() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//        Class clazz=Class.forName(properties.getProperty("userService"));
//        UserService userService=(UserService)clazz.newInstance();
//        return userService;
//    }

    /*
        通用工厂
     */
    public static Object getBean(String beanName) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class clazz=Class.forName(properties.getProperty(beanName));
        return clazz.newInstance();
    }
}

        至此,可以发现,我们提供的工厂方法可以被任意对象所调用,并创建通用的对象,这样我们解决代码耦合性的同时,也解决了一个对象创建一个工厂的问题,减少了代码的冗余。

3.2通用工厂的使用方式

1.定义类型

2.通过配置文件的配置告知工厂(application.properties)

key=value

3.通过工厂来获得类的对象

        BeanFactory.getBean(key)

总结

         通过本文的学习,我们了解了Spring框架的基本概念以及如何通过工厂设计模式和反射机制实现代码的解耦。Spring的IoC和AOP特性使得企业级应用开发更加简单和高效。工厂模式通过将对象的创建和使用分离,进一步提高了代码的可维护性和扩展性。希望本文能帮助你更好地理解Spring和设计模式的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984210.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫案例八js逆向爬取网易音乐

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、js逆向的前期准备二、网站分析三、代码 前言 提示:这里可以添加本文要记录的大概内容: 爬取网易音乐 提示:以下是本篇…

【02】Web网页基础

一、网页的组成 1、HTML 2、CSS 3、javascript 二、网页的结构 三、节点树及节点间的关系 四、选择器 一、网页的组成 网页可以分为三大部分 —— HTML、CSS 和 JavaScript。如果把网页比作一个人的话,HTML 相当于骨架,JavaScript 相当于肌肉&#…

Dify部署踩坑指南(Windows+Mac)

组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本,nginx端口不要直接修改docker-compose.yaml !!!!!!! 1、更换镜像版本 这个文件是由.env自动生成的,在.env配置 …

​​《从事件冒泡到处理:前端事件系统的“隐形逻辑”》

“那天在document见到你的第一眼,我就下定决心要陪你到天荒地老” ---React 我将从事件从出现到被处理的各个过程来介绍事件机制: 这张图片给我们展示了react事件的各个阶段,我们可以看到有DOM,合成事件层,还有…

tiktok web登录 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 部分代码 response reques…

【音视频】ffplay常用命令

一、 ffplay常用命令 -x width:强制显示宽度-y height:强制显示高度 强制以 640*360的宽高显示 ffplay 2.mp4 -x 640 -y 360 效果如下 -fs 全屏显示 ffplay -fs 2.mp4效果如下: -an 禁用音频(不播放声音)-vn 禁…

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…

基于SpringBoot的“文物管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“文物管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体功能模块图 E-R实体图 系统首页界面 系统…

微信小程序投票系统的构建与实现

在数字化时代,微信小程序已经成为人们日常生活的重要组成部分。无论是企业宣传、活动组织还是社交互动,小程序都展现出了其强大的功能和便捷的用户体验。其中,微信小程序的投票系统尤为突出,它不仅能简化投票流程,还能…

【Java篇】数据类型与变量:窥见程序的天地万象

文章目录 Java 数据类型与变量基础:从零开始,轻松掌握前言一、字面常量1.1 什么是字面常量?1.2 字面常量的分类1.2.1 字符串常量1.2.2 整形常量1.2.3 浮点数常量1.2.4 字符常量1.2.5 布尔常量1.2.6 空常量 1.3 字面常量与数据类型 二、Java 中…

绿盟春招面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

操作系统控制台-健康守护我们的系统

引言基本准备体验功能健康守护系统诊断 收获提升结语 引言 阿里云操作系统控制平台作为新一代云端服务器中枢平台,通过创新交互模式重构主机管理体验。操作系统控制台提供了一系列管理功能,包括运维监控、智能助手、扩展插件管理以及订阅服务等。用户可以…

Linux系统基于ARM平台的LVGL移植

软硬件介绍:Ubuntu 20.04 ARM 和(Cortex-A53架构)开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的,如果想要实现在ARM开发板上运行LVGL图形库,那么就需要把LVGL图形库提供的关于帧缓冲设…

DIY Tomcat:手写一个简易Servlet容器

在Java Web开发领域,Tomcat堪称经典,它作为Servlet容器,承载着无数Web应用的运行。今天,我将带大家一同探索如何手写一个简易的Tomcat,深入理解其底层原理。 一、背景知识 在开始之前,我们需要对几个关键…

PDF转JPG(并去除多余的白边)

首先,手动下载一个软件(poppler for Windows),下载地址:https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误: PDFInfoNotInstalledError: Unable to get pag…

网络安全之端口扫描(一)

前置介绍 什么是DVWA? DVWA(Damn Vulnerable Web Application)是一个专门设计用于测试和提高Web应用程序安全技能的开源PHP/MySQL Web应用程序。它是一个具有多个安全漏洞的故意不安全的应用程序,供安全专业人员、渗透测试人员、…

财务会计域——合并报表系统设计

摘要 本文主要介绍了合并报表系统的设计,包括其背景、业务流程和系统架构设计。合并报表系统可自动化生成数据,减少人为错误,确保报表合规。其业务流程涵盖数据收集、标准化、合并调整、报表生成、审核及披露等环节。系统架构设计包括数据接…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…

NoSQL数据库系统Cassandra学习笔记

详细文档:我用夸克网盘分享了「noSQL.pdf」,点击链接即可保存。打开「夸克APP」在线查看,支持多种文档格式转换。 链接:https://pan.quark.cn/s/dfc3864807b4 参考链接:黑马程序员NoSQL数据库系统Cassandra全套教程&a…

苹果 M3 Ultra 芯片深度解析:AI 时代的性能革命

2025 年 3 月 5 日,苹果正式发布了其史上最强 PC 芯片 ——M3 Ultra。这款基于 UltraFusion 封装技术的旗舰级 SoC,不仅延续了苹果芯片在能效比上的传统优势,更通过架构创新与硬件升级,将 AI 计算能力推向了新高度。本文将从性能突…