【推荐】深入浅出学习Spring框架

news2025/1/18 7:18:34

目录

 1.spring简介

1.1含义

1.2优点

2,Spring之IOC详解

 2.1,控制反转是什么

2.2,控制反转案例

2.1.3案例前台测试

3、IoC的三种注入方式

3.1 构造方法注入

3.2 setter方法注入 

3.3 接口注入(自动装配)===用的最多,最方便 

4.spring与web容器的整合


 1.spring简介

1.1含义

       Spring是一个开源框架,它由Rod Johnson创建。 

        spring ==>"春天",意味着javaIT迎来了 “春天” ,
        spring无处不在,自从这个框架推出以来,就一直被程序员们喜爱,受欢迎,很多项目中广     泛运用,Spring还拥有科技界所有知名人士的贡献,包括阿里巴巴,亚马逊,谷歌,Microsoft等

   简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

 Spring的核心loc和AOP:

 

 

Spring官网https://spring.io/why-spring

1.2优点

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。

   然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

   目的:解决企业应用开发的复杂性

   功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能

   范围:任何Java应用-

2,Spring之IOC详解

 2.1,控制反转是什么

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。 IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中 ,就是将以前由程序员实例化对象/赋值的工作交给了spring处理。

2.2,控制反转案例

场景演练:客户需求,更改个人信息 ,但是现在需要在这个基础之上做迭代 可以上传头像,并且提高性能

1.如果客户说“有些地方需要上传头像功能,有些地方不需要上传头像功能呢”

package com.sy.ioc.service.impl;

import com.sy.ioc.service.UserService;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 14:28
 * 客户的需求:
 * 需求:客户登录后需要具备更改个人信息的功能
 *
 * 场景一:
 * 客户要求,在新增的需求上做迭代,如上传头像
 * 场景二:
 *客户要求,再新增的需求上做优化,提高性能,如使用多线程
 *
 */
public class UserServiceImp implements UserService {
    public void update(){
        System.out.println("更改个人用户信息");
//        添加上传头像的功能代码
        System.out.println("上传头像的功能");
    }
}

2.我们就可以建立两个类,一个类有上传头像功能,一个没有,到时候在后台调用的时候,调用不同的类就行,

package com.sy.ioc.service.impl;

import com.sy.ioc.service.UserService;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 14:28
 * 客户的需求:
 * 需求:客户登录后需要具备更改个人信息的功能
 *
 * 场景一:
 * 客户要求,在新增的需求上做迭代,如上传头像
 * 场景二:
 *客户要求,再新增的需求上做优化,提高性能,如使用多线程
 *
 */
public class UserServiceImpl implements UserService {
    public void update(){
        System.out.println("更改个人用户信息");
//        添加上传头像的功能代码
//        System.out.println("上传头像的功能");
    }
}
package com.sy.ioc.service.impl;

import com.sy.ioc.service.UserService;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 14:28
 * 客户的需求:
 * 需求:客户登录后需要具备更改个人信息的功能
 *
 * 场景一:
 * 客户要求,在新增的需求上做迭代,如上传头像
 * 场景二:
 *客户要求,再新增的需求上做优化,提高性能,如使用多线程
 *
 */
public class UserServiceImp implements UserService {
    public void update(){
        System.out.println("更改个人用户信息");
//        添加上传头像的功能代码
        System.out.println("上传头像的功能");
    }
}

用IoC来运用一下,将实例化对象的这一步交给spring来帮助我们完成。

首先,我们要先建一个spring的配置文件

 接下来我们将UserService看作一个属性,给它写set,get方法

然后编辑xml.文件,凡是在spring配置文件中配置,那么该类JavaBean就交给了spring容器管理我们在里面像下面,web层和Impl层,写出路径,并且给它命一个ID 将impl注入该类中,那么该类就用了impl中的方法

<?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">
<!-- 凡是再spring核心配置文件 spring-conetxt.xml中配置,那么该类JavaBean就交给spring容器-->
    <bean class="com.sy.ioc.web.UserAction" id="userAction">
<!--        将impl注入User Action-->
        <property name="userService" ref="userService"></property>
    </bean>

    <bean class="com.sy.ioc.web.GoodsAction" id="goodAction">
        <!--        将impl注入User Action-->
        <property name="userService" ref="userService1"></property>
    </bean>
    <bean class="com.sy.ioc.service.impl.UserServiceImp" id="userService"></bean>
    <bean class="com.sy.ioc.service.impl.UserServiceImpl" id="userService1"></bean>
</beans>

2.1.3案例前台测试

package com.sy.ioc.demo;


import com.sy.ioc.web.GoodsAction;
import com.sy.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 16:37
 */
public class Demo1 {
    public static void main(String[] args){
//        加载获取spring配置文件及上下文对象,可以获取
        ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/spring-context.xml");
//    通过id获取
        UserAction userAction= (UserAction) context.getBean("userAction");
        userAction.update();
       System.out.println("=========================================");

        GoodsAction goodsAction =(GoodsAction) context.getBean("goodAction");
      goodsAction.update();
    }
}

3、IoC的三种注入方式


3.1 构造方法注入

构造函数注入(Constructor Injection):通过构造函数来注入依赖对象。在类的构造函数中声明依赖对象的参数,并在容器中配置时提供相应的依赖对象。当创建对象实例时,容器会自动将依赖对象传递给构造函数,完成依赖注入。

先定义属性,其次提供有参,无参构造方法,一样提供获取属性的方法

package com.sy.ioc.web;

import com.sy.ioc.service.UserService;

import java.util.List;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 14:47
 *
 * 程序员手动实列化对象的弊端
 * 1.一旦依赖的接口的实现需要大批量改动,迭代,维护成本极高
 * 2.当接口的实现类不统一,维护成本更高
 */
public class UserAction {
    private UserService userService;
//      将一个类看作一个属性
    private String uname;//用户名字
    private int age;//用户年龄
    private List<String> hobby;//用户喜好

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public UserAction(String uname, int age, List<String> hobby) {
        this.uname = uname;
        this.age = age;
        this.hobby = hobby;
    }

    public UserAction() {
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getHobby() {
        return hobby;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    public String update(){
        userService.update();
      return "list";
    }

}

最后再前台输入

package com.sy.ioc.demo;


import com.sy.ioc.web.GoodsAction;
import com.sy.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 16:37
 */
public class Demo1 {
    public static void main(String[] args){
//        加载获取spring配置文件及上下文对象,可以获取
        ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/spring-context.xml");
//    通过id获取
        UserAction userAction= (UserAction) context.getBean("userAction");
        userAction.update();
       System.out.println("=========================================");

        GoodsAction goodsAction =(GoodsAction) context.getBean("goodAction");
      goodsAction.update();
      System.out.println("===============================================");
    goodsAction.pros();
    System.out.println("=============================================");

    }
}

结果:

 

3.2 setter方法注入 

Setter方法注入(Setter Injection):通过setter方法来注入依赖对象。在类中定义相应的setter方法,并在容器中配置时使用相应的属性或标签指定依赖对象。当创建对象实例后,容器会调用相应的setter方法,将依赖对象注入到对象中。

 先创建属性,提供get,set方法,写一个方法调用这些属性 

package com.sy.ioc.web;

import com.sy.ioc.service.UserService;

import java.util.List;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 15:00
 */
public class GoodsAction {
    private UserService userService;
//    将一个类看作一个属性
    private  String gname;//商品名字
    private int age;//保质期
    private List<String> type;//种类

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getType() {
        return type;
    }

    public void setType(List<String> type) {
        this.type = type;
    }

    public String update(){//调用方法
        userService.update();
        return "list";
    }

    public void pros(){//获取属性
        System.out.println(this.gname);
        System.out.println(this.age);
        System.out.println(this.type);


    }
}

  然后再配置文件中,注入这些属性

然后再到前台调用: 

package com.sy.ioc.demo;


import com.sy.ioc.web.GoodsAction;
import com.sy.ioc.web.UserAction;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-16 16:37
 */
public class Demo1 {
    public static void main(String[] args){
//        加载获取spring配置文件及上下文对象,可以获取
        ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("/spring-context.xml");
//    通过id获取
        UserAction userAction= (UserAction) context.getBean("userAction");
        userAction.update();
       System.out.println("=========================================");

        GoodsAction goodsAction =(GoodsAction) context.getBean("goodAction");
      goodsAction.update();
      System.out.println("===============================================");
    goodsAction.pros();
    System.out.println("=============================================");

    }
}

结果:

3.3 接口注入(自动装配)===用的最多,最方便 

  有两种方式:byNamebyType
        byName:javabean会根据属性名在spring配置文件上下文中根据spring上下文中的bean ID进行查找,只要有就会自动注入
        byType:javabean会根据属性名对应的接口类型在spring配置文件上下文中根据spring上下文是否有该接口类型的实现类进行注入,如果找到两个及以上,那么spring配置文件会包错
 

4.spring与web容器的整合

我们每一个请求如果都要拿到UserActiob都需要建模一次的话,非常消耗性能,希望只建模一次,然后每一个请求都可以获取到spring上下文,那么就有监听器可以做到,将spring放入tomcat上下文

创建一个监听器将spring放入tomcat上下文

当用户请求的时候,获取spring上下文对象  

运行结果:

 

 

 

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

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

相关文章

⛳ Java 反射

目录 ⛳ Java 反射&#x1f3a8; 一、反射概述**&#x1f383; 使用反射的前提条件: **&#x1f3b2; 类正常加载过程如下图&#xff1a;反射优缺点&#xff1a;&#x1f9f8; Java反射机制提供的功能: **&#x1f945; 反射主要API** &#x1f3ed; 二、反射的使用&#x1f3a…

01.修改simvision字体大小

修改simvision字体大小 ①cd ~/.simvision ② ls 查看是否有Xdefaults文件 1.如果有&#xff0c;gedit/vim Xdefaults 打开文件&#xff0c;搜索SrcBrowser修改数字&#xff0c;默认12这里修改成25&#xff0c;还有WaveWindow、DesignBrowser等都能改&#xff0c;我全部都修改…

爬虫逆向实战(四)--猿人学第一题

一、数据接口分析 主页地址&#xff1a;猿人学第一题 1、抓包 当我们打开F12时会发现直接debugger了&#xff0c;是一个无限debugger&#xff0c;我们直接右键debugger那一行&#xff0c;然后选择“一律不再此处暂停”就可以了 通过抓包可以发现登录接口是api/match/1 2、…

一条提示词等同于多少个数据点?

数据点&#xff08;data points&#xff09;通常用于描述单个信息单位或观测值&#xff0c;在本文中&#xff0c;它被用来量化“提示词”方法相对于传统方法的效率和效果。文章比较了两种训练&#xff08;微调&#xff09;机器学习模型的方法&#xff1a;一种是使用提示 (promp…

python——案例23:创建一个按钮

案例23&#xff1a;创建一个按钮from tkinter import * def xinlabel():global xinsLabel(xin,text完成)s.pack() xinTk() blButton(xin,text下一步,commandxinlabel) bl.pack() xin.mainloop()

【golang】函数(func)正确使用姿势

函数不但可以用于封装代码、分割功能、解耦逻辑&#xff0c;还可以化身为普通的值&#xff0c;在其他函数间传递、赋予变量、做类型判断和转换等等&#xff0c;就像切片和字典的值那样。 而更深层次的含义就是&#xff1a;函数值可以由此成为能够被随意传播的独立逻辑组件&…

使用PyMuPDF库的PDF合并和分拆程序

PDF工具应用程序是一个使用wxPython和PyMuPDF库编写的简单工具&#xff0c;用于合并和分拆PDF文件。它提供了一个用户友好的图形界面&#xff0c;允许用户选择源文件夹和目标文件夹&#xff0c;并对PDF文件进行操作。 C:\pythoncode\blog\pdfmergandsplit.py 功能特点 选择文…

高速数据采集卡---AD采集FMC子卡模块产品资料下载

FMC152是一款基于VITA57.1标准的&#xff0c;实现2路14-bit、2GSPS/2.6GSPS/3GSPS AD采集FMC子卡模块。该模块可直接与FPGA载卡配合使用&#xff0c;板卡ADC器件采用ADI公司的AD9208芯片&#xff0c;与ADI公司的AD9689可以实现PIN脚兼容。该模块全功率模拟输入带宽&#xff08;…

【FAQ】安防监控视频云存储平台EasyNVR频繁离线的原因排查与解决

有用户反馈&#xff0c;在使用EasyNVR时会出现通道频繁离线的情况。针对该反馈我们立即进行了排查。 安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流…

(二)结构型模式:6、外观模式(Facade Pattern)(C++实例)

目录 1、外观模式&#xff08;Facade Pattern&#xff09;含义 2、外观模式的UML图学习 3、外观模式的应用场景 4、外观模式的优缺点 5、C实现外观模式的简单实例 1、外观模式&#xff08;Facade Pattern&#xff09;含义 外观模式&#xff08;Facade Pattern&#xff09;…

气象监测设备——分类与应用

气象监测设备多种多样&#xff0c;不同的应用场景选择适合的气象监测设备才能事半功倍。 在植保站中&#xff0c;可以 选择农林植保小气候气象站&#xff0c;它可以帮助植保站的工作人员完成气象监测工作&#xff0c;对天气环境进行预报预测&#xff0c;为植物的健康生长提供保…

Windows系统如何查看端口被占用程序和停止占用端口程序

windows系统如何查看端口被占用程序和停止占用端口程序&#xff0c;以及windows常用的网络命令详解 打开命令窗口 电脑右下方&#xff0c;搜索框&#xff0c;输入“cmd”,回车打开dos命令窗口 查看系统所有被占用的端口命令 netstat -ano 查看指定端口是否被占用命令 netst…

CS144 计算机网络 Lab1:Stream Reassembler

前言 上一篇博客中我们完成了 Lab0&#xff0c;使用双端队列实现了一个字节流类 ByteStream&#xff0c;可以向字节流中写入数据并按写入顺序读出数据。由于网络环境的变化&#xff0c;发送端滑动窗口内的数据包到达接收端时可能失序&#xff0c;所以接收端收到数据之后不能直…

Windows Server --- RDP远程桌面服务器激活和RD授权

RDP远程桌面服务器激活和RD授权 一、激活服务器二、设置RD授权 系统&#xff1a;Window server 2008 R2 服务&#xff1a;远程桌面服务 注&#xff1a;该方法适合该远程桌面服务器没网络状态下&#xff08;离线&#xff09;&#xff0c;激活服务器。 一、激活服务器 1.打开远…

Spring学习笔记之Bean的循环依赖问题

文章目录 什么是Bean的循环依赖singleton下的set注入产生的循环依赖prototype下的set注入产生的循环依赖singleton下的构造注入产生的循环依赖Spring解决循环循环的机理&#xff08;面试题&#xff09; 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。…

leetcode 1614.括号的最大嵌套深度

⭐️ 题目描述 &#x1f31f;leetcode链接&#xff1a;括号的最大嵌套深度 ps&#xff1a; 使用数据结构栈来存储 ( 在使用 maxDepth 变量记录栈顶 top 的最大值&#xff0c;当遇到 ) 时删除栈顶元素。举个例子 (1)((2))(((3)))&#xff0c;当遇到第一个 ( 时 top 1&#xff…

对dubbo的DubboReference.check的参数进行剖析

背景 在使用dubbo的时候&#xff0c;发现当消费者启动的时候&#xff0c;如果提供者没有启动&#xff0c;即使提供者后来启动了&#xff0c;消费者也调不通提供者提供的接口了。 注册中心使用都是nacos dubbo版本是3.0.4 例子 接口 public interface DemoService {String…

中期国际:外汇交易的利器:善用挂单技巧优化交易策略

在外汇交易中&#xff0c;挂单技巧是提高交易效率和灵活性的重要利器之一。善用限价单和止损单可以帮助交易者有效规避风险、控制入场点和出场点&#xff0c;从而提高交易效果。本文将介绍一些MT4挂单技巧&#xff0c;以帮助交易者优化交易策略&#xff0c;提高交易效率。 1. 了…

猿辅导设立“青少年科学探索基金”,鼓励天才少年投入科学研究

“少年智则国智&#xff0c;少年富则国富&#xff0c;少年强则国强。”国家发展离不开人才的培养。伴随我国进入高质量发展轨道&#xff0c;科学、人才、教育三位一体融合发展已经刻不容缓。我国基础学科人才紧缺成了不争的事实。目前&#xff0c;中国的GDP目前已是世界第二位&…

nginx创建和监听套接字分析

https://cloud.tencent.com/developer/article/1859856 简介 nginx作为一个web服务器&#xff0c;肯定是有listen套接字对外提供服务的&#xff0c;listen套接字是用于接收HTTP请求。 nginx监听套接字的创建是根据配置文件的内容来创建的&#xff0c;在nginx.conf文件中有…