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

news2024/12/29 10:50:43

目录

  • 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 回调执行原理

在这里插入图片描述

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

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

相关文章

经典网络 循环神经网络(一) | RNN结构解析,代码实现

文章目录 1 提出背景2 RNN2.1 RNN结构2.2 RNN代码实现2.3 代码简洁实现 1 提出背景 为什么要引入RNN呢&#xff1f; 非常简单&#xff0c;之前我们的卷积神经网络CNN&#xff0c;全连接神经网络等都是单个神经元计算 但在序列模型中&#xff0c;前一个神经元往往对后面一个神…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

36V/1.6A两通道H桥驱动芯片-SS8812T可替代DRV8812

由工采网代理的SS8812T是一款双通道H桥电流控制电机驱动器&#xff1b;每个 H 桥可提供输出电流 1.6A&#xff0c;可驱动两个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0c;或者螺线管或者其它感性负载&#xff1b;双极步进电机可以以整步、2 细分、4 细分运行&…

旧路由重置新路由设置新路由设置教程|适用于自动获取IP模式

前言 如果你的光猫是直接拨号&#xff08;路由模式&#xff09;的&#xff0c;就可以按照本教程进行路由重置或者更换新路由器。 本文章适合电脑小白&#xff0c;请注意每一步哦&#xff01; 注意事项 开始之前需要确认光猫是桥接模式还是路由模式。如果光猫是路由模式&…

❤ HbuildX使用以及快捷键

❤ HbuildX使用以及快捷键 一、HbuildX使用 HbuildX左侧项目侧边栏 点击视图 > 显示项目左侧即可 二、HBuilder X 快捷键 左移 Shift tab 右移 tab 查找 全局文件搜索:CtrlP 本文档内查找字符串:ctrlf 目录内查找字符串:ctrlaltf 替换:ctrlh 查找下一个字符串:f3 查…

表的增删改查CURD(一)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 新增&#xff08;Create&#xff09; 全列插入 指定列…

SDK游戏盾是什么?,sdk游戏盾有什么作用

在现今的游戏市场&#xff0c;游戏保护成为了每个游戏开发者都不能忽视的重要环节。恶意破解、作弊和盗版等问题严重影响了游戏的安全性和商业价值。而如何保护自己的游戏免受这些威胁&#xff0c;已经成为游戏开发者们面临的重大挑战。好在SDK游戏盾&#xff0c;它如同保护游戏…

家用小型洗衣机哪款性价比高?好用的内衣洗衣机推荐

现在大多数的上班族&#xff0c;面临的都是早九晚六的工作&#xff0c;而且工作完下班回家还是面对各种各样的家务&#xff0c;特别是清洗需要换洗的洗衣&#xff0c;属实是有点辛苦了。可能很多人为了方便&#xff0c;每次洗衣服的都是把一堆衣服直接丢进洗衣机&#xff0c;直…

Ansible Filter滤波器的使用(一)

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

光学 | 联合Ansys Zemax及Lumerical应对AR/VR市场挑战

当前的增强现实和虚拟现实&#xff08;AR/VR&#xff09;市场涵盖了广泛的应用趋势&#xff0c;设计人员和各企业在努力寻找非传统解决方案&#xff0c;以满足主流消费者不断变化的需求。 对于AR头戴设备等可穿戴解决方案&#xff0c;设计思路通常源于对小巧轻量化系统的需求&a…

大数据传输慢的真正原因与解决方案

随着企业数据不断增长&#xff0c;大数据传输已成为一项至关重要的任务。然而&#xff0c;许多企业在处理大数据传输时频繁遭遇传输速度慢的问题。本文将深入探讨大数据传输速度慢的根本原因&#xff0c;并提供一些切实有效的解决方案。 大数据传输在企业中的重要性不言而喻&am…

算法竞赛备赛进阶之数位DP训练

数位DP的思想就是对每一位进行DP&#xff0c;计算时记忆化每一位可以有的状态&#xff0c;其作用是减少运算时间&#xff0c;避免重复计算。 数位DP是一种计数用的DP&#xff0c;一般就是要统计一个区间[A,B]内满足一些条件数的个数。 以1e9甚至1e18、1e100的问题为例&#x…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一&#xff1a;创建自定义网络 首先&#xff0c;我们需要创建一个自定义网络&#xff0c;以便容器可以连接到这个网络上&#xff0c;从而实现互相通信。在命令行中执行以下命令&#xff1a; # 创建 docker network create ddz # 查看 docker n…

洛谷 P1523 旅行商简化版【线性dp+npc问题简化版】

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1523 题目背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家、计算机学家的著名问题。现有的算法都没有办法在确定型机器上在多项式时间内求出最优解&#xff0c;但是有…

2024 年企业要增强反脆弱性,IT 能够做什么?

新冠疫情被称为黑天鹅事件&#xff0c;而“黑天鹅”这个词的创造者纳西姆尼古拉斯塔勒布在另一本书《反脆弱&#xff1a;从不确定性中获益》&#xff08; CSDN博主读书笔记《反脆弱&#xff1a;从不确定性中获益》 &#xff09;中&#xff0c;则给出了面对随时可能出现的黑天鹅…

玖章算术NineData通过阿里云PolarDB产品生态集成认证

近日&#xff0c;玖章算术旗下NineData 云原生智能数据管理平台 (V1.0&#xff09;正式通过了阿里云PolarDB PostgreSQL版 (V11)产品集成认证测试&#xff0c;并获得阿里云颁发的产品生态集成认证。 测试结果表明&#xff0c;玖章算术旗下NineData数据管理平台 (V1.0&#xff…

Python源码23:海龟画图turtle画小狗狗

---------------turtle源码集合--------------- Python教程43&#xff1a;海龟画图turtle画小樱魔法阵 Python教程42&#xff1a;海龟画图turtle画海绵宝宝 Python教程41&#xff1a;海龟画图turtle画蜡笔小新 Python教程40&#xff1a;使用turtle画一只杰瑞 Python教程39…

❤ Uniapp使用一(文档和 API 篇)

❤ Uniapp使用一&#xff08;文档和 API 篇&#xff09; 一、介绍 uni-app官网&#xff1a;https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html …

使用WAF防御网络上的隐蔽威胁之SQL注入攻击

SQL注入攻击是一种普遍存在且危害巨大的网络安全威胁&#xff0c;它允许攻击者通过执行恶意的SQL语句来操纵或破坏数据库。 这种攻击不仅能够读取敏感数据&#xff0c;还可能用于添加、修改或删除数据库中的记录。因此&#xff0c;了解SQL注入攻击的机制及其防御策略对于保护网…

Spring基于AOP(面向切面编程)开发

概述 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&…