Spring见解 1

1.Spring概述

1.1.Spring介绍

​ Spring是轻量级Java EE应用开源框架(官网: http://spring.io/ ),它由Rod Johnson创为了解决企业级编程开发的复杂性而创建

1.2.简化应用开发体现在哪些方面?

  1. IOC

    解决传统Web开发中硬编码所造成的程序耦合

  2. AOP

    实现在运行期间不修改源代码对程序进行增强

  3. 粘合剂

    Spring是一个超级粘合平台,除了自己提供功能外,还提供整合其他技术和框架的能力

1.3.Spring的体系结构

Spring 框架根据功能的不同大体可分为 Data Access/Integration(数据访问与集成)WebAOP、Aspects、Instrumentation(检测)、Messaging(消息处理)Core Container(核心容器)Test
请添加图片描述

  • Core Container: 框架的最基础部分,提供控制反转和依赖注入特性
  • AOP :提供了面向切面的编程的实现
  • Data Access/Integration:简化了持久层的操作
  • Web:提供了Spring MVC Web 框架实现以及与Servlet、WebSocket的集成
  • Test:方便程序的测试

1.4.Spring的发展历程

  • 1997年IBM提出了EJB的思想

  • 1998年,SUN制定开发标准规范EJB1.0

  • 1999年,EJB1.1发布

  • 2001年,EJB2.0发布

  • 2003年,EJB2.1发布

    Rod Johnson(spring之父)

    Expert One-to-One J2EE Design and Development(2002)

    ​ 阐述了J2EE使用EJB开发设计的优点及解决方案

    Expert One-to-One J2EE Development without EJB(2004)

    ​ 阐述了J2EE开发不使用EJB的解决方式(Spring雏形)

  • 2006年,EJB3.0发布

  • 2017年9月发布了Spring的最新版本Spring5.0通用版x

2.Spring IOC

2.1.程序的耦合

  • 耦合:耦合指的就是对象之间的依赖关系。对象之间的耦合越高,维护成本越高。

  • 案例:没有引入IOC容器时系统的Web层、业务层、持久层存在耦合

    /**
     * 持久层实现类
     */
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void addUser(){
            System.out.println("insert into tb_user......");
        }
    }
    
    /**
     * 业务层实现类
     */
    public class UserServiceImpl implements UserService {
        //硬编码:此处有依赖关系
        private UserDao userDao = new UserDaoImpl();
    
        public void addUser(){
            userDao.addUser();
        }
    }
    
    /**
     * 模拟表现层
     */
    public class Client {
        public static void main(String[] args) {
            //硬编码:此处有依赖关系
            UserService userService = new UserServiceImpl();
            userService.addUser();
        }
    }
    
  • 问题分析:

    上边的代码service层在依赖dao层的实现类,此时如果更改dao了层的实现类或此时没有dao层实现类,编译将不能通过。

  • IOC(工厂模式)解耦:

    1. 把所有的dao和service对象使用配置文件配置起来
    2. 当服务器启动时读取配置文件
    3. 把这些对象通过反射创建出来并保存在容器中
    4. 在使用的时候,直接从工厂拿

2.2.IOC解决程序耦合

2.2.1.创建工程

请添加图片描述

2.2.2.什么是IOC

  • IOC (Inverse of Control)即控制反转:由ioc容器来创建依赖对象,程序只需要从IOC容器获取创建好的对象。

  • 原来:

    ​ 我们在获取对象时,都是采用new的方式。是主动的。
    在这里插入图片描述

  • 现在:

​ 我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。

在这里插入图片描述

​ 这种被动接收的方式获取对象的思想就是控制反转,它是spring框架的核心之一。

2.2.3.IOC(工厂模式)解耦

  • 案例一

    /**
     * bean工厂
     */
    public class BeanFactory_v1 {
    
        /**
         * 获得UserServiceImpl对象
         * @return
         */
        public static UserService getUserService(){
            return new UserServiceImpl();
        }
    
        /**
         * 获得UserDaoImpl对象
         * @return
         */
        public static UserDao getUserDao(){
            return new UserDaoImpl();
        }
    }
    

    问题:我们在开发中会有很多个service和dao,此时工厂类就要添加无数个方法。

  • 案例二

    #1、配置要使用的dao和service
    UserDao=com.by.dao.UserDaoImpl
    UserService=com.by.service.UserServiceImpl
    
    /**
     * bean工厂
     */
    public class BeanFactory_v2 {
    
        private static Properties prop = new Properties();
    
        /**
         * 根据全类名获取bean对象
         * @param beanName
         * @return
         * @throws ClassNotFoundException
         */
       
        public static Object getBean(String beanName) {
            try {
                //不能使用:web工程发布后没有src目录
                //InputStream is = new FileInputStream("src/bean.properties");
                InputStream is = 
                BeanFactory_v2.class.getClassLoader()
                    .getResourceAsStream("bean.properties");
                prop.load(is);
                return Class.forName(prop.getProperty(beanName)).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            System.out.println(prop.get("UserService"));
            System.out.println(getBean("UserService"));
        }
    }
    
    /**
     * 业务层实现类
     */
    public class UserServiceImpl implements UserService {
        
        private UserDao userDao = (UserDao) BeanFactory.getBean("UserDao");
    
        public void addUser(){
          userDao.addUser();
        }
    }
    

    测试:

    /**
     * 模拟表现层
     */
    public class Client {
        public static void main(String[] args) {
            //直接引用接口实现类
          for (int i = 0; i < 5; i++) {
                UserService userService = 
                  (UserService)BeanFactory.getBean("UserService");
                System.out.println(userService);
            }
        }
    }
    
    image-20210930122936696 问题:
    1. 每次都会创建新的对象
    2. 程序运行时才创建对象(读取配置文件)
  • 案例三

    package com.by.factory;
    
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;
    
    /**
     * bean工厂
     */
    public class BeanFactory_v3 {
    
        //定义一个容器,用于存放对象
        private static Map<String, Object> beans = new HashMap<>();
    
        /**
         * 加载配置文件
         */
        static {
            try {
                //2、读取配置文件
                //不能使用:web工程发布后没有src目录
                //InputStream is = new FileInputStream("src/bean.properties");
                InputStream is = 
                BeanFactory_v3.class.getClassLoader()
                    .getResourceAsStream("bean.properties");
    
                //3、通过反射创建对象,把对象存到容器中
                Properties prop = new Properties();
                prop.load(is);
                Set<Map.Entry<Object, Object>> entrySet = prop.entrySet();
                for (Map.Entry<Object, Object> entry : entrySet) {
                    String key = entry.getKey().toString();
                    String beanName = entry.getValue().toString();
                    Object value = Class.forName(beanName).newInstance();
                    beans.put(key, value);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 4、在使用的时候,直接从工厂拿
         * @param beanName
         * @return
         */
        public static Object getBean(String beanName) {
            try {
                return beans.get(beanName);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void main(String[] args) {
            System.out.println(getBean("UserService"));
        }
    }
    

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

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

相关文章

SpringBoot—支付—微信

一、支付流程 1.1、支付准备 1.获取商户号 微信商户平台 申请成为商户 > 提交资料 > 签署协议 > 获取商户号 2.获取 AppID 微信公众平台 注册服务号 > 服务号认证 > 获取APPID > 绑定商户号 3.申请商户证书 登录商户平台 > 选择 账户中心 > 安全…

Kali Linux实现UEFI和传统BIOS(Legacy)引导启动

默认Kali linux安装会根据当前启动的引导模式进行安装 例:以UEFI引导启动安装程序,安装后仅能在UEFI引导模式下进入系统 安装Kali系统 这边基于VirtualBox虚拟机镜像实战操作 首先创建一个Kali虚拟机 这里需要注意,把启动 EFI (只针对某些操作系统)选项勾选上,内存、处理器…

I.MX6ULL_Linux_驱动篇(52)linux CAN驱动

CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一&#xff0c;由于其高可靠性&#xff0c; CAN 总线…

酷雷曼精彩亮相CMC 2023中国元宇宙大会,助力云上VR直播

12月23日&#xff0c;2023中关村论坛系列活动——CMC 2023中国元宇宙大会在石景山首钢园冰壶馆成功举办。酷雷曼VR作为元宇宙领域代表企业之一受邀出席会议&#xff0c;分享元宇宙技术研发成果及应用方案&#xff0c;并为大会提供VR直播技术支持。 大咖云集&#xff0c;共商元宇…

数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)

目录 一、概述 二、原理 三、搭建 1、备份数据 2、主库配置Ubuntu22.04 2.1、设置阿里云服务器安全组 2.2、修改配置文件 /etc/my.cnf 2.3、重启MySQL服务 2.4、登录mysql&#xff0c;创建远程连接的账号&#xff0c;并授予主从复制权限 2.5、通过指令&#xff0c;查…

进程终结之道:kill与pskill的神奇战斗

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 进程终结之道&#xff1a;kill与pskill的神奇战斗 前言基本用法kill命令&#xff1a;基础语法&#xff1a;选项&#xff1a;示例&#xff1a; pskill命令&#xff1a;基础语法&#xff1a;选项&#x…

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么&#xff1f;为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失&#xff0c;软件无法启动”&#xff1f; 首先&#xff0c;先来了解“kbdnecnt.DLL文件”是什么&#xff1f; kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…

JOSEF约瑟 断电延时继电器 SRTD-220VDC-2H2D 导轨安装

系列型号&#xff1a; SRTD-24VDC-1H1D断电延时继电器&#xff1b;SRTD-110VDC-1H1D断电延时继电器&#xff1b; SRTD-220VDC-1H1D断电延时继电器&#xff1b;SRTD-110VAC-1H1D断电延时继电器&#xff1b; SRTD-220VAC-1H1D断电延时继电器&#xff1b;SRTD-24VDC-2H断电延时继电…

考PMP真的有用吗?看完立马不犹豫了!

其实我个人觉得在你考证之前&#xff0c;值得反思的是&#xff1a;为什么要考这个证书&#xff1f;是因为公司需要&#xff1f;个人职业发展&#xff1f;还是受到新闻报道或广告的影响&#xff0c;觉得PMP证书有价值&#xff0c;只是想了解一下。这样就会导致很多人会说&#x…

golang并发编程-channel

在golang 并发编程里&#xff0c;经常会听到一句话&#xff1a;不要通过共享内存进行通信&#xff0c;通过通信来共享内存。下面我们会介绍下channel, 通过源码的方式去了解channel是怎么工作的。 基本结构 流程图 代码解读 type hchan struct {qcount uint // …

HubSpot邮件营销好用吗?

HubSpot的邮件营销工具通常被认为是非常强大和易用的&#xff0c;但用户的体验和满意度会因个人需求和经验而异。以下是一些通常与HubSpot邮件营销工具相关的优势&#xff1a; 全面的功能&#xff1a; HubSpot的邮件营销工具提供了丰富的功能&#xff0c;包括电子邮件自动化、…

西门子消防主机电源维修控制器BCB8005

火灾自动报警部分主要由各个部位的火灾探测器及手动报警按钮、消火栓按钮等设备组成。火灾探测器就如同火灾报警系统的“眼睛”,通过各自的火灾探测器采集现场的火警信号&#xff0c;实时传送给火灾报警控制器&#xff0c;火灾报警控制器进行各种智能的分析判断后发出火灾报警&…

【力扣题解】P700-二叉搜索树中的搜索-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P700-二叉搜索树中的搜索-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合&#xff08;List列表、Tuple元组、Dict字典、Set&#xff09;-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

【双指针算法】-- 左右指针

左右指针 前言一、双指针算法二、左右指针1.用于在已排序数组中找到两个数使其和为特定值2.在字符串中判断是否为回文 总结 前言 今天在刷Leetcode的时候觉得自己双指针掌握的还是不错的记录一下,写个学习笔记,也方便以后翻阅,如果也帮助到你了,那真是太好啦! 本篇介绍的是左右…

八大算法排序@希尔排序(C语言版本)

目录 希尔排序概念算法思想示例分析结论算法步骤选择增量序列按增量分组逐步缩小增量 算法优势 代码实现核心算法希尔排序代码实现&#xff1a; 时间复杂度空间复杂度特性总结 该排序会关联到直接插入排序的知识点&#xff0c;如果对于直接插入排序还有所疑惑&#xff0c;可以跳…

Stable Diffusion模型概述

Stable Diffusion 1. Stable Diffusion能做什么&#xff1f;2. 扩散模型2.1 正向扩散2.2 反向扩散 3. 训练如何进行3.1 反向扩散3.2 Stable Diffusion模型3.3 潜在扩散模型3.4 变分自动编码器3.5 图像分辨率3.6 图像放大 4. 为什么潜在空间是可能的&#xff1f;4.1 在潜在空间中…

uniapp:签字版、绘画板 插件l-signature

官方网站&#xff1a;LimeUi - 多端uniapp组件库 使用步骤&#xff1a; 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后&#xff0c;在项目中的uni_modules目录 3、最后 没有其它步骤&#xff0c;直接官网代码复制到vue文件中就可以了&#xff0c…

挑战 ChatGPT 和 Google Bard 的防御

到目前为止&#xff0c;科学家已经创建了基于人工智能的聊天机器人&#xff0c;可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件&#xff0c;尽管地下社区对此并不满意。但现在正在创建聊天机器人&#xff0c;可以使用生成人工智能通过即时注入活动来…

stable diffusion 基础教程-文生图

置顶大模型插件资源链接 你如果没有魔法上网,请自取 百度云盘链接:链接:https://pan.baidu.com/s/1_xAu47XMdDNlA86ufXqAuQ?pwd=23wi 提取码:23wi 界面介绍 参数解释 参数解释Sampling method扩散去噪算法的采样模式,不同采样模式会带来不一样的效果steps模型生成图片的迭…