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 {@Overridepublic 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"));}
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt图像绘制QPainter

QPainter 以下是一些常用的 Qt::PenStyle 枚举值&#xff1a; Qt::NoPen&#xff1a;无线条。Qt::SolidLine&#xff1a;实线。Qt::DashLine&#xff1a;虚线&#xff0c;由短划线组成。Qt::DotLine&#xff1a;点线&#xff0c;由点组成。Qt::DashDotLine&#xff1a;点划线&…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …

如何使用Docker部署Swagger Editor结合内网穿透实现远程编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

AI 工具探索(二)

我参加了 奇想星球 与 Datawhale 举办的 【AI办公 X 财务】第一期&#xff0c;现在这是第二次打卡&#xff0c;也即自由探索&#xff0c;我选择 Modelscope 的 Agent 探索&#xff0c;并用gpts创作助理对比&#xff01; 最近想学学小红书的运营方法&#xff0c;选择了 小红书I…

什么是高防 IP?哪些行业适合用高防 IP?

在数字化浪潮席卷全球的今天&#xff0c;网络安全问题日益凸显。有听说过“高防 IP”这个名词吗&#xff1f;它究竟是什么东西&#xff0c;又能在哪些领域大显身手呢&#xff1f; 一、什么是高防 IP&#xff1f; 高防 IP&#xff0c;顾名思义&#xff0c;就是具备高级防护能力…

jsp结合servlet

servlet配置 环境配置2023.12.31 idea配置搭建 创建一个普通的java项目 由于新版idea去除了add framework support的ui显示&#xff0c;可以在左边项目栏中使用快捷键shiftk或者setting中搜索add framework support在修改对应的快捷键 点击ok然后应该就是下面这样的结果 这里…

从零实现一套低代码(保姆级教程) --- 【11】实现Card卡片组件及属性样式配置

摘要 我们通过十个篇章&#xff0c;把组件列表&#xff0c;画布区&#xff0c;属性面板&#xff0c;样式面板&#xff0c;容器组件这五个主要模块实现出来了。 如果想继续添加组件&#xff0c;就按照之前的方式添加即可。对于数据录入这样的组件&#xff0c;或者一个按钮一个…

Java中的数据类型

目录 ! >>> ?: 输入&#xff1a; switch: 快捷键&#xff1a; 提交Gitee仓库&#xff1a; next和nextLine区别&#xff1a; 注意事项&#xff1a; 循环终止&#xff1a; 产生随机数&#xff1a; 比较字符串&#xff1a; 关闭方法&#xff1a; …

JavaWeb——前端之AjaxVue

6. 前后端交互 6.1 Ajax&#xff08;原生的&#xff09; 概念&#xff1a; Asynchronous JavaScript And XML&#xff08;异步的JavaScript和XML&#xff09; 作用&#xff1a; 数据交互&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据异步交…

如何快速搭建自己的外贸/跨境电商独立站?

外贸老鸟一定听过行业内某些大神通过运营外贸独立站获得成百上千封的询盘&#xff0c;看到别人每天询盘接到手软常常羡慕不已&#xff0c;再回头看看自己的网站&#xff0c;一年到头也收不到几个询盘。等到终于抽出时间下定决心要打造自己的外贸独立站接单平台&#xff0c;又常…

数据库攻防学习之Redis

Redis 0x01 redis学习 在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识&#xff0c;那么什么是redis&#xff1f;redis就是个数据库&#xff0c;常见端口为6379&#xff0c;常见漏洞为未授权访问。 0x02 环境搭建 这里可以自己搭建一个redis环境&#xf…

从 0 到 1 实现 ReentrantLock

虽然本文的标题是从 0 到 1 实现 ReentrantLock &#xff0c;但是为了方便理解&#xff0c;我们先从一个问题出发&#xff1a;既然系统已经有 synchronized 关键字了&#xff0c;那么为什么还会出现 ReentrantLock 这种代码层面的锁? 这就要先回顾一下历史了&#xff1a;在 J…