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, 方法名不能是类名
    @Test
    public 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标签时,则会根据反射的机制实例化对象

@Test
    public 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> {
    //工厂模式实例化对象的方法
    @Override
    public Calendar getObject() throws Exception {
        return Calendar.getInstance();
    }

    //获取类型
    @Override
    public Class<?> getObjectType() {
        return Calendar.class;
    }

    //默认条件下spring容器中都是单例对象  节省空间 单例对象  多例对象
    //多线程问题  多例对象 ?????  安全性问题!
    //多个资源对共享数据进行操作!!!!
    //对象.方法() 没有安全性问题  提倡使用单例
    @Override
    public 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 回调执行原理

在这里插入图片描述

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

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

相关文章

云计算平台建设总体技术方案详细参考

第1章. 基本情况 1.1. 项目名称 XX 公司 XX 云计算平台工程。 1.2. 业主公司 XX 公司。 1.3. 项目背景 1.3.1. XX 技术发展方向 XX&#xff0c;即运用计算机、网络和通信等现代信息技术手段&#xff0c;实现政府组织结构和工作流程的优化重组&#xff0c;超越时间、空间…

【AIGC入门一】Transformers 模型结构详解及代码解析

Transformers 开启了NLP一个新时代&#xff0c;注意力模块目前各类大模型的重要结构。作为刚入门LLM的新手&#xff0c;怎么能不感受一下这个“变形金刚的魅力”呢&#xff1f; 目录 Transformers ——Attention is all You Need 背景介绍 模型结构 位置编码 代码实现&…

设计模式之开闭原则:如何优雅地扩展软件系统

在现代软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。其中&#xff0c;开闭原则作为面向对象设计的六大基本原则之一&#xff0c;为软件系统的可维护性和扩展性提供了强大的支持。本文将深入探讨开闭原则的核心理念&#xff0c;以及如何在实际项目中运用这一原则&a…

Rust-借用和生命周期

生命周期 一个变量的生命周期就是它从创建到销毁的整个过程。其实我们在前面已经注意到了这样的现象&#xff1a; 然而&#xff0c;如果一个变量永远只能有唯一一个入口可以访问的话&#xff0c;那就太难使用了。因此&#xff0c;所有权还可以借用。 借用 变量对其管理的内存…

C#编程-自定义属性

命名自定义属性 让我们继续漏洞修复示例,在这个示例中新的自定义属性被命名为BugFixingAttribute。通常的约定是在属性名称后添加单词Attribute。编译器通过允许您调用具有短版名称的属性来支持附加。 因此,可以如以下代码段所示编写该属性: [ BugFixing ( 122,"Sara…

C#用double.TryParse(String, Double)方法将字符串类型数字转换为数值类型

目录 一、定义 二、实例 命名空间: System 程序集: System.Runtime.dll 一、定义 将数字的字符串表示形式转换为它的等效双精度浮点数。 一个指示转换是否成功的返回值。 public static bool TryParse (string? s, out double result…

蓝桥杯备赛 | 洛谷做题打卡day3

蓝桥杯备赛 | 洛谷做题打卡day3 sort函数真的很厉害&#xff01; 文章目录 蓝桥杯备赛 | 洛谷做题打卡day3sort函数真的很厉害&#xff01;【深基9.例1】选举学生会题目描述输入格式输出格式样例 #1样例输入 #1 样例输出 #1 我的一些话 【深基9.例1】选举学生会 题目描述 学校…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-2 常用表单控件

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>常用表单控件</title> <style> form {width: 260px;margin: 0 auto;border: 1px solid #ccc;padding: 20px; } .right {float: right; } </style&g…

【学习笔记】2、逻辑代数与硬件描述语言基础

2.1 逻辑代数 &#xff08;1&#xff09;逻辑代数的基本定律和恒等式 基本定律或 “”与 “”非 “—”0-1律A0AA11AAAA A ‾ \overline{A} A1(互补律)A00A1AAAAA A ‾ \overline{A} A0 A ‾ ‾ \overline{\overline{A}} AA结合律(AB)C A(BC)(AB)CA(BC)ABC交换律AB BAABBA分…

广州市生物医药及高端医疗器械产业链大会暨联盟会员大会召开,天空卫士数据安全备受关注

12月20日&#xff0c;广州市生物医药及高端医疗器械产业链大会暨联盟会员大会在广州举办。在本次会议上&#xff0c;作为大会唯一受邀参加主题分享的技术供应商&#xff0c;天空卫士南区技术总监黄军发表《生物制药企业如何保护数据安全》的主题演讲。 做好承上启下“连心桥”…

【Spring实战】29 @Value 注解

文章目录 1. 定义2. 好处3. 示例1&#xff09;注入基本类型2&#xff09;注入集合类型3&#xff09;使用默认值4&#xff09;注入整数和其他类型 总结 在实际的应用中&#xff0c;我们经常需要从外部配置文件或其他配置源中获取参数值。Spring 框架提供了 Value 注解&#xff0…

感染了后缀为.mallox勒索病毒如何应对?数据能够恢复吗?

尊敬的读者&#xff1a; 在数字时代&#xff0c;勒索病毒如.mallox已经成为网络威胁中的重要一环。这篇文章将深入介绍.mallox勒索病毒的特征、应对策略以及如何预防这一威胁。面对复杂的勒索病毒&#xff0c;您需要数据恢复专家作为坚强后盾。我们的专业团队&#xff08;技术…

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件&#xff1a; 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式&#xff0c;然后打开 USB 调试模式。 具体操作步骤如下&#xff1a; 将安卓手机通过 USB 线连接到 PC。&#xff08;连接的时候&#xff0c;会弹出请求&#x…

收银系统源码-智慧新零售系统框架

智慧新零售系统是一套线下线上打通的收银系统&#xff0c;主要给门店提供含线下收银、线上小程序商城、ERP进销存、精细化会员管理、丰富营销插件等为一体的智慧行业解决方案。智慧新零售系统有合伙人、代理商、商户、门店、收银员/导购员等角色&#xff0c;每个角色有相应的权…

Fine-tuning:个性化AI的妙术

在本篇文章中&#xff0c;我们将深入探讨Fine-tuning的概念、原理以及如何在实际项目中运用它&#xff0c;以此为初学者提供一份入门级的指南。 一、什么是大模型 ChatGPT大模型今年可谓是大火&#xff0c;在正式介绍大模型微调技术之前&#xff0c;为了方便大家理解&#xf…

C++系统笔记教程----vscode远程连接ssh

C系统笔记教程 文章目录 C系统笔记教程前言开发环境配置总结 前言 开发环境配置 Ubuntu20.24VScode 如果没有linux系统&#xff0c;但是想用其编译&#xff0c;可以使用ssh远程连接。 首先进入vscode,打开远程连接窗口&#xff08;蓝色的小箭头这&#xff09; 选择连接到主机…

Redis主从架构、哨兵集群原理实战

1.主从架构简介 背景 单机部署简单&#xff0c;但是可靠性低&#xff0c;且不能很好利用CPU多核处理能力生产环境必须要保证高可用&#xff0c;一般不可能单机部署读写分离是可用性要求不高、性能要求较高、数据规模小的情况 目标 读写分离&#xff0c;扩展主节点的读能力&…

案例:应用内字体大小调节

文章目录 介绍相关概念完整实例 代码结构解读保存默认大小获取字体大小修改字体大小 介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动…

【电子通识】开漏输出和推挽输出有什么差别?

在看一些MCU芯片手册的时候&#xff0c;能发现GPIO的功能有开漏输出和推挽式输出。那么这两种输出到底有什么差别&#xff1f; 如下是STM32F10xxx参考手册中对于GPIO的功能描述&#xff1a; 如下为GPIO内部框图&#xff1a; 在一些其他的芯片规格书中也同样看到不同的GPIO工作…

java基于Spring Boot的灾害应急救援评估调度平台

灾害应急救援平台的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。&#xff08;1&#xff09;鉴于该系统是一款面向…