DAY01_Spring—Spring框架介绍IOCSpring工厂模式

目录

  • 1 什么是框架
  • 2 Spring框架
    • 2.1 Spring介绍
    • 2.2 MVC模型说明
    • 2.3 IOC思想
      • 2.3.1 问题说明
      • 2.3.2 IOC说明
  • 3 Spring IOC具体实现
    • 3.1 环境准备
      • 3.1.1 关于JDK说明
      • 3.1.2 检查JDK环境配置
    • 3.2 创建项目
    • 3.3 关于Maven 命令
      • 3.3.1 install 命令
      • 3.3.2 clean 命令
    • 3.4 添加jar包文件
      • 3.4.1 spring版本说明
      • 3.4.2 引入Spring jar包
    • 3.5 编辑实体对象
    • 3.6 编辑application.xml
    • 3.7 Spring入门案例
  • 4 Spring IOC原理
    • 4.1 Spring容器如何创建对象
    • 4.2 关于反射机制补充说明
  • 5 工厂模式
    • 5.1 问题
    • 5.2 静态工厂模式
      • 5.2.1 编辑静态工厂
      • 5.2.2 编辑配置文件
      • 5.2.3 编辑测试方法
    • 5.3 实例化工厂模式
      • 5.3.1 编辑实例化工厂
      • 5.3.2 编辑xml配置文件
      • 5.3.3 编辑测试类
    • 5.4 Spring工厂模式
      • 5.4.1 编辑工厂代码
      • 5.4.2 编辑xml配置文件
      • 5.4.3 编辑测试类代码
      • 5.4.4 回调执行原理

1 什么是框架

  • 说明:
    • 将公共的模块(功能) 进行高级的抽取(接口/父级)形成了通用的代码体.
  • 使用:
    • 引入特定的jar包/class/方法 既可以使用框架中的功能.
  • 实际意义:
    • 简化代码的开发.提高软件的扩展性.

2 Spring框架

2.1 Spring介绍

Spring框架为任何类型的部署平台上的基于Java的现代企业应用程序提供了全面的编程和配置模型。

Spring的一个关键元素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。
总结: Spring的主要的作用将其他框架进行整合,以一种统一的通用的方法进行管理(“角色:框架的大管家”)

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

  • Bean:
    • 被spring容器管理的对象称之为Bean

2.2 MVC模型说明

在大型项目中由于模块众多,如果将所有的项目都写到一起则代码特别的混乱.不便于后期的维护. 所以通过MVC设计模型,将代码进行分级.
实现步骤: 分为3级

  • M(Model) 持久层 代码与数据库进行交互的代码(Mybatis-dao层)
  • C(Control) 控制层 完成某项业务的具体操作过程(Controller层----Service层)
  • V(View) 视图层 一般指用户看到的内容(页面)

在这里插入图片描述

2.3 IOC思想

2.3.1 问题说明

传统的代码是直接通过new的方式创建对象. 这样的方式将对象与对象紧紧的绑定到一起,不便于代码的扩展.所以需要进行松耦合处理.
在这里插入图片描述

2.3.2 IOC说明

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

将对象的创建的权利交给Spring管理, 由Spring(第三方)管理对象的生命周期(创建/初始化/使用/销毁).

在这里插入图片描述

3 Spring IOC具体实现

3.1 环境准备

3.1.1 关于JDK说明

在这里插入图片描述

3.1.2 检查JDK环境配置

1).环境变量配置
在这里插入图片描述

2).检查path路径

检查环境变量中,有几个JDK 如果不确定,则将自己的JDK配置为第一项…

在这里插入图片描述

3.2 创建项目

在这里插入图片描述

3.3 关于Maven 命令

3.3.1 install 命令

  • 将项目打包处理

在这里插入图片描述

打包之后的结果:

在这里插入图片描述

3).本地仓库位置

在这里插入图片描述

在这里插入图片描述
4).maven坐标

坐标的主要作用就是用来检索jar包文件的. maven通过这样的方式管理了几乎所有的开源jar包.(中央仓库/私服镜像)

<groupId>com.jt</groupId>
<artifactId>spring_demo_1_ioc</artifactId>
<version>1.0-SNAPSHOT</version>

5).本地仓库中的jar包主要的作用就是被自己的项目进行依赖 (松耦合)

3.3.2 clean 命令

  • 将target文件目录删除

在这里插入图片描述

3.4 添加jar包文件

3.4.1 spring版本说明

在这里插入图片描述

3.4.2 引入Spring jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jt</groupId><artifactId>spring_demo_1_ioc</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--Spring核心包--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.22</version></dependency><!--引入SpringBean--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.3.22</version></dependency><!--引入context包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.22</version></dependency><!--引入表达式jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.3.22</version></dependency><!--引入日志依赖--><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><!--引入测试包--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>

3.5 编辑实体对象

在这里插入图片描述

3.6 编辑application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--1.动态生成Spring配置文件  注意头标签--><!--2.Spring容器管理对象id: Spring容器中对象的唯一标识 不能重复 一般类名首字母小写class: 类的全路径 包名.类名--><bean id="user" class="com.jt.pojo.User"></bean></beans>

3.7 Spring入门案例

package com.jt;import com.jt.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestUser {//测试方法返回值必须为void, 方法名不能是类名@Testpublic void testSpring01(){//1.通过加载配置文件,创建Spring容器对象  容器创建对象创建ApplicationContext context =new ClassPathXmlApplicationContext("application.xml");//2.从容器中获取对象  通过bean的Id获取对象User user = (User) context.getBean("user");/*User user2 = context.getBean(User.class);User user3 = context.getBean("user",User.class);*///3.执行方法user.say();}
}

4 Spring IOC原理

4.1 Spring容器如何创建对象

1).当Spring程序执行时,首先会根据配置文件的内容进行解析

2).当程序解析到bean标签时,则会根据反射的机制实例化对象

@Testpublic void demo2() throws ClassNotFoundException, IllegalAccessException, InstantiationException {//1.通过类的路径实例化类型...Class userClass = Class.forName("com.jt.pojo.User");//2.实例化对象User user = (User) userClass.newInstance();user.say();
}

3).将实例化好的对象保存到超大的Map集合中<K,V> bean中的Id当做map的Key,实例化好的对象当做Value
Map<id,对象>

4). 从容器中获取对象. 则从Map集合中通过id获取对象即可.

User user = (User) context.getBean("user");

4.2 关于反射机制补充说明

反射机制 必然调用对象的无参构造方法,所以特别注意!!!

public class User {//反射机制调用时,必然调用对象的无参构造,所以写构造方法时必须先写无参构造public User() {System.out.println("我是一个无参构造");}public void say() {System.out.println("您好Spring框架");}
}

在这里插入图片描述

5 工厂模式

5.1 问题

通过spring容器创建的对象一般是通过反射机制调用.但是有的时候由于业务需要需要实例化抽象类的对象/复杂的接口对象 Spring提供了工厂模式用于实例化复杂对象!!!

5.2 静态工厂模式

  • 静态方法特点:
    • 静态方法调用可以通过类名直接调用. static
    • 静态属性 内存当中独一份.

5.2.1 编辑静态工厂

import java.util.Calendar;public class StaticFactory {//通过静态工厂获取数据public static Calendar getCalendar() {return Calendar.getInstance();}
}

5.2.2 编辑配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--静态工厂实例化对象的写法 方法必须是static--><bean id="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>
</beans>

5.2.3 编辑测试方法

@Test
public void testStatic(){ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Calendar calendar1 = (Calendar) context.getBean("calendar1");System.out.println("获取当前时间"+calendar1.getTime());
}

5.3 实例化工厂模式

  • 调用:
    • 对象.方法()

5.3.1 编辑实例化工厂

import java.util.Calendar;public class InstanceFactory {//获取Calendar对象public Calendar getCalendar(){return Calendar.getInstance();}
}

5.3.2 编辑xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--1.静态工厂实例化对象的写法 方法必须是static--><bean id="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/><!--2.实例化工厂   步骤1:将工厂交给spring容器管理   步骤2: 通过对象调用方法 --><bean id="instanceFactory" class="com.jt.factory.InstanceFactory"></bean><bean id="calendar2" factory-bean="instanceFactory" factory-method="getCalendar"></bean></beans>

5.3.3 编辑测试类

@Test
public void testInstance(){ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Calendar calendar2 = (Calendar) context.getBean("calendar2");System.out.println("获取当前时间"+calendar2.getTime());
}

5.4 Spring工厂模式

如果需要创建复杂对象首选工厂模式

5.4.1 编辑工厂代码

import org.springframework.beans.factory.FactoryBean;import java.util.Calendar;public class SpringFactory implements FactoryBean<Calendar> {//工厂模式实例化对象的方法@Overridepublic Calendar getObject() throws Exception {return Calendar.getInstance();}//获取类型@Overridepublic Class<?> getObjectType() {return Calendar.class;}//默认条件下spring容器中都是单例对象  节省空间 单例对象  多例对象//多线程问题  多例对象 ?????  安全性问题!//多个资源对共享数据进行操作!!!!//对象.方法() 没有安全性问题  提倡使用单例@Overridepublic boolean isSingleton() {return true;}
}

5.4.2 编辑xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--静态工厂实例化对象的写法 方法必须是static--><bean id="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/><!--2.实例化工厂   步骤1:将工厂交给spring容器管理   步骤2: 通过对象调用方法 --><bean id="instanceFactory" class="com.jt.factory.InstanceFactory"></bean><bean id="calendar2" factory-bean="instanceFactory" factory-method="getCalendar"></bean><!--3.spring工厂模式 --><bean id="calendar3" class="com.jt.factory.SpringFactory"></bean>
</beans>

5.4.3 编辑测试类代码

@Test
public void testSpringFactory(){ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Calendar calendar3 = (Calendar) context.getBean("calendar3");System.out.println("获取当前时间"+calendar3.getTime());
}

5.4.4 回调执行原理

在这里插入图片描述

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

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

相关文章

flutter使用getx进行数据状态管理,实现页面响应式

无论是什么样的应用&#xff0c;都还是需要最基础的数据来支撑的&#xff0c;而且不同的页面之间可能需要共享数据状态&#xff0c;这就显得数据状态管理非常有必要了。因为我这里使用了get依赖库&#xff0c;所以就可以直接在项目中使用getx来管理状态&#xff0c;不想再使用别…

服务器机房上架交付流程

服务器上架交付 服务器到货验收后&#xff0c;会进行机房机房上架&#xff0c;完成重装系统、网络配置后交付使用 1、到货验收 采购服务器到货后&#xff0c;会联合多部门进行SN、配置、数量等多方面验收&#xff0c;如数量是否匹配&#xff0c;配置是否相符等也会拆开机箱看看…

Python基础知识:整理10 异常相关知识

1 异常的捕获 1.1 基础写法 """基本语法&#xff1a;try:可能发生错误的代码except:如果出现异常&#xff0c;将执行的代码""" try:fr open("D:/abc.txt", "r", encoding"utf-8") except:print("出现异常…

APM传感器校准

文章目录 前言一、校准加速度计二、校准罗盘三、校准陀螺仪四、校平地平线 前言 固件&#xff1a;rover 4.2.3 地面站&#xff1a;独家汉化版QGC 一、校准加速度计 点击左上角软件图标-》载具设置-》传感器-》加速度计 飞控方向默认为None即可&#xff0c;点击确定 点击确…

德语怎么翻译,中文翻译成德文有何要求?

近年来&#xff0c;随着中德之间的贸易往来日益频繁&#xff0c;德语翻译需求在市场上持续升温。那么&#xff0c;如何做好德语翻译&#xff0c;特别是将中文翻译成德文需要注意哪些要求呢&#xff1f; 首先&#xff0c;深入理解中文原文的语境和含义至关重要。中文含蓄且抽象&…

存储的基本架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、存储的需求背景二、自下而上存储架构总结 一、存储的需求背景 1、人的身份信息需要存储 这种信息可以用关系型数据库&#xff0c;例如mysql&#xff0c;那种表…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式&#xff1a;使用内核线程实现&#xff08;1&#xff1a; 1 实现&#xff09;&#xff0c;使用用户线程实现&#xff08;1&#xff…

FFmpeg 入门

1. 编译 参考文档&#xff1a;FFmpeg编译和集成(FFmpeg开发基础知识)&#xff0c;重点注意这句话&#xff1a; 在MSYS2 Packages可以查到云仓库有哪些包&#xff0c;直接安装可节约大量时间。 注意&#xff1a;这个路径可自定义 吐槽 在看到这篇文章之前&#xff0c;花了大…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

【银行测试】银行项目,信用卡业务测试+常问面试(三)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行测试-信用卡业…

C++I/O流——(3)文件输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

[M链表] lc82. 删除排序链表中的重复元素 II(单链表+好题+模拟)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;82. 删除排序链表中的重复元素 II 相似题目&#xff1a;[E链表] lc83. 删除排序链表中的重复元素(单链表模拟) 2. 题目解析 这个题目与 83 题都很类似&#xff0c;一个是将重复元素全部删除&#xff0c;另一个…

面试宝典之ElasticSearch面试题

E01、什么是倒排索引&#xff1f; ES分词器通过扫描文章中的每一个词&#xff0c;对每一个词建立一个索引&#xff0c;指明该词在文章中出现的次数和位置&#xff0c;当用户查询时&#xff0c;检索程序就根据事先建立的索引进行查找&#xff0c;并将查找的结果反馈给用户的检索…

检索增强生成的多模态信息:综述

英文原文地址&#xff1a;Retrieving Multimodal Information for Augmented Generation: A Survey 随着大型语言模型&#xff08;LLMs&#xff09;的流行&#xff0c;出现了一个重要趋势&#xff0c;即使用多模态来增强 LLMs 的生成能力&#xff0c;从而使 LLMs 能够更好地与…

Github项目推荐-clone-voice

项目地址 GitHub - jianchang512/clone-voice 项目简述 一个声音ai工具。基于python编写。作用是音色复用。下面是官方说明&#xff1a;“这是一个声音克隆工具&#xff0c;可使用任何人类音色&#xff0c;将一段文字合成为使用该音色说话的声音&#xff0c;或者将一个声音使…

行为型设计模式——模板方法模式

学习难度&#xff1a;⭐ &#xff0c;比较常用 模板方法模式 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0…

SpringBoot项目的两种发布方式(jar包和war包)

SpringBoot项目的两种发布方式&#xff08;jar包和war包&#xff09; 在springboot入门和项目示例这个项目和application.yml配置端口号和访问url路径基础上进行修改 1、使用jar包方式发布 1.1、在pom.xml中添加一个SpringBoot的构建的插件 <build><plugins>&l…

腾讯云服务器多少钱?2024年腾讯云服务器报价明细表

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

测试人,你还在写用例吗?是什么在支撑着你写?

测试交付的过程&#xff0c;通常是伴随的是一个测试用例生命周期过程&#xff0c;通常有测试需求分析、测试用例设计、测试用例实现、测试用例执行&#xff0c;以及测试用例管理等几个阶段组成。 为什么要有测试用例&#xff1f; 首先测试用例这是测试岗位的基本交付物之一。开…

第10章-特殊函数-贝塞尔函数

贝兹函数又称贝塞尔曲线&#xff0c;是计算机图形学中相当重要的参数曲线&#xff0c;在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。 贝塞尔函数由线段和节点组成&#xff0c;节点是可拖动的支点&#xff0c;线段像可伸缩的皮筋&#xff0c;通过 控制曲线上的4个点&…