“深入了解Spring框架:IOC、注入方式和与Web容器的整合“

news2025/1/19 14:22:41

目录

  • 1. Spring框架简介
  • 2. Spring的IOC(控制反转)
  • 3. Spring的注入方式
    • 3.1 第一种:构造函数注入
    • 3.2 第二种:Setter方法注入
    • 3.3 第三种:注解注入
      • 按名称注入(byname):
      • 按类型注入(byType):
  • 4. Spring与Web容器的整合
      • 配置监听器
      • 配置Servlet
  • 总结:

在这里插入图片描述

1. Spring框架简介

Spring是一个轻量级的开源Java框架,用于构建企业级应用程序。它提供了一种全面的编程和配置模型,用于开发灵活、可扩展的应用程序。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、控制反转(IOC)等。

2. Spring的IOC(控制反转)

IOC是Spring框架的核心概念之一,也是Spring框架的基石。IOC的基本思想是将对象的创建、组装和管理交给Spring容器来完成,而不是由开发人员手动管理对象的生命周期。通过IOC,开发人员可以将应用程序的各个组件解耦,提高代码的可维护性和可测试性。

  • spring-context.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">
    <bean class="com.yuan.web.UserAction" id="userAction" >
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>

</beans>
  • UserService
package com.yuan.service;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:10
 */
public interface UserService {
    public void update();
}

  • UserAction
package com.yuan.web;

import com.yuan.service.UserService;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:15
 */
public class UserAction {
    private UserService userService;

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

    public UserService getUserService() {
        return userService;
    }

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

  • GoodsAction
package com.yuan.web;

import com.yuan.service.UserService;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:15
 */
public class UserAction {
    private UserService userService;

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

    public UserService getUserService() {
        return userService;
    }

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

  • 测试类
package com.yuan.text;

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

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 14:27
 */
public class demo1 {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
        UserAction userAction = (UserAction) context.getBean("userAction");
             userAction.update();

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

  • 运行结果
    在这里插入图片描述

3. Spring的注入方式

Spring框架提供了多种注入方式,以满足不同场景下的需求。下面介绍三种常用的注入方式:

3.1 第一种:构造函数注入

构造函数注入是通过调用目标对象的构造函数来完成依赖注入。在Spring配置文件中,通过标签指定构造函数的参数值或引用。

  • spring-context.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">
    <bean class="com.yuan.web.UserAction" id="userAction" >
        <property name="userService" ref="userService"></property>
        <constructor-arg name="uname" value=""></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="pros">
            <list>
                <value>维多利亚狗</value>
                <value>土狗</value>
            </list>

        </constructor-arg>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
        <property name="gname" value="电脑"></property>
        <property name="age" value="10"></property>
        <property name="pors">
            <list>
                <value>程序员</value>
                <value>社会人</value>
            </list>
        </property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>

</beans>
  • 运行结果
    在这里插入图片描述

3.2 第二种:Setter方法注入

Setter方法注入是通过调用目标对象的Setter方法来完成依赖注入。在Spring配置文件中,通过标签指定属性的值或引用。

  • spring-context.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">
    <bean class="com.yuan.web.UserAction" id="userAction" >
        <property name="userService" ref="userService"></property>
    </bean>
    <bean class="com.yuan.web.GoodsAction" id="goodsAction" >
        <property name="userService" ref="userService2"></property>
        <property name="gname" value="电脑"></property>
        <property name="age" value="10"></property>
        <property name="pors">
            <list>
                <value>程序员</value>
                <value>社会人</value>
            </list>
        </property>
    </bean>
    <bean class="com.yuan.service.impl.UserServiceimpl1" id="userService"></bean>
    <bean class="com.yuan.service.impl.UserServiceimpl2" id="userService2"></bean>

</beans>
  • 运行结果
    在这里插入图片描述

3.3 第三种:注解注入

注解注入是通过在目标对象的属性、构造函数或Setter方法上添加注解来完成依赖注入。常用的注解包括@Autowired、@Resource等。

按名称注入(byname):

使用@Autowired注解时,如果存在多个同类型的Bean对象,Spring会根据依赖对象的名称来进行注入。
在注入时,Spring会查找与依赖对象名称相同的Bean对象,并将其注入到目标对象中。
如果找不到与依赖对象名称相同的Bean对象,Spring会抛出异常。

按类型注入(byType):

使用@Autowired注解时,如果存在多个同类型的Bean对象,Spring会根据依赖对象的类型来进行注入。
在注入时,Spring会查找与依赖对象类型相同的Bean对象,并将其注入到目标对象中。
如果找不到与依赖对象类型相同的Bean对象,Spring会抛出异常。

4. Spring与Web容器的整合

Spring框架与Web容器的整合是为了更好地支持Web应用程序的开发。Spring提供了多种方式与Web容器进行整合,常见的方式包括:

  • 4.1 使用Spring MVC框架:Spring MVC是Spring框架的一部分,用于开发基于MVC模式的Web应用程序。通过配置Spring MVC,可以将请求映射到相应的控制器,并实现灵活的请求处理和视图渲染。
  • 4.2 使用Spring Boot:Spring Boot是Spring框架的扩展,用于简化Spring应用程序的开发和部署。Spring Boot提供了内嵌的Web容器,可以直接运行Spring应用程序,无需额外配置。
  • 4.3 使用Spring和其他Web容器的集成:Spring框架可以与其他常见的Web容器(如Tomcat、Jetty等)进行集成,通过配置文件或注解来实现。

配置监听器

package com.yuan.listeer;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 16:40
 */
@WebListener("")
public class SpringLoadListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        //将spring上下文放入Tomcat上下文
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");

        //获取Tomcat上下文
        ServletContext servletContext = sce.getServletContext();
        servletContext.setAttribute("springContext",context);


    }

}

配置Servlet

package com.yuan.servlet;

import com.yuan.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-08-15 16:49
 */@WebServlet("/userList")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取spring上下文对象
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) req.getServletContext().getAttribute("springContext");
        UserService userService = (UserService) context.getBean("userService");
        userService.update();
        System.out.println(userService);

    }
}

  • 运行结果
    在这里插入图片描述

总结:

本篇博客介绍了Spring框架的基本概念和核心特性,重点讲解了IOC、注入方式和与Web容器的整合。通过深入了解Spring框架,开发人员可以更好地利用Spring提供的功能和特性,提高应用程序的开发效率和质量。

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

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

相关文章

算法通关村第九关 | 二叉树查找和搜索树原理

1. 二分查找的扩展问题 1.1山脉数组的巅峰索引 LeetCode852&#xff1a;题目核心意思是在数组中&#xff0c;从0到i是递增的&#xff0c;从i1到数组最后是递减的&#xff0c;让你找到这个最高点。 三种情况&#xff1a; mid在上升阶段的时候&#xff0c;满足arr[mid] > a…

Docker容器与虚拟化技术:Docker容器操作、网络模式

目录 一、理论 1.Docker 容器操作 2.Docker 网络 二、实验 1.Docker 容器操作 2.Docker 网络 2.Docker 的网络模式 三、问题 1. 批量删除所有容器未生效 2.使用bridge模式指定IP运行docker报错 3.未显示bridge网络模式名称 四、总结 一、理论 1.Docker 容器操作 &a…

TVP助力数智化转型:数字物业与产业园区智慧化高质量发展

引言 数字化技术的蓬勃发展&#xff0c;为传统行业转型提供了前所未有的机遇。相较于早期的基础数字化&#xff0c;现如今数字化转型已逐步踏入更深层次。在各个领域&#xff0c;将数字技术与实际应用有机融合已日益显得迫切。如何在这一浪潮中巧妙融合数字技术与传统行业&…

cesium加载wms服务

成果图 源码 cesium加载不用像其他api一样加那么多参数&#xff0c;最终请求路径上发现他也是把那些参数都加上了&#xff0c;应该是有默认的参数吧 var wmsLayer new Cesium.WebMapServiceImageryProvider({url: http://你的地址/pjgeoserver/services/wms,layers: services…

Golang协程,通道详解

进程、线程以及并行、并发 关于进程和线程 进程&#xff08;Process&#xff09;就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理资源的基本单位&#xff0c;每一…

leetcode611. 有效三角形的个数(java)

有效三角形的个数 有效三角形的个数排序加二分排序 双指针 上期算法 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使…

python进阶做题日记365-1,

第一天&#xff1a; 1&#xff1a;题目名称&#xff1a;代写匿名信时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述小Q想要匿名举报XX领导不务正业&#xff01; 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。 现在小Q找来了报纸…

【分布式存储】数据存储和检索~倒排索引pageRank

为什么需要倒排索引 通过前两篇的文章介绍&#xff0c;B树主要针对的是读多写少的场景&#xff0c;而LSM针对的是写多读少的场景&#xff0c;其实在日常开发中&#xff0c;我们会将数据存储到搜索引擎中&#xff0c;然后进行数据的搜索&#xff0c;这种场景其实针对的是快速根…

AI幕后的关键技术之一——HBM

半导体产业步入下行周期之际&#xff0c;2023年ChatGPT的“走红”为产业带来新的发展方向&#xff1a;AI人工智能。 ChatGPT正掀起一场声势浩大的AI浪潮&#xff0c;AI时代下&#xff0c;为满足海量数据存储以及日益增长的繁重计算要求&#xff0c;半导体存储器领域也迎来新的变…

shell第九章iptables防火墙

防火墙&#xff1a;隔离功能 部署点&#xff1a;部署在网络边缘&#xff0c;或者主机边缘&#xff0c;在工作中&#xff0c;防火墙的主要作用&#xff0c;决定那些数据可以被外网访问&#xff0c;以及哪些数据可以进入内网访问 讨论防火墙&#xff0c;主要就是在网络层进行讨…

无涯教程-Perl - setsockopt函数

描述 此函数将SocketoptionsOPTNAME的值设置为SOCKET上指定级别的OPTVAL值。您需要导入Socket模块,以获取Tabl中显示的OPTNAME的有效值 语法 以下是此函数的简单语法- setsockopt SOCKET, LEVEL, OPTNAME, OPTVAL返回值 如果失败,此函数返回undef&#xff1b;如果成功,则返…

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

错误&#xff1a; java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfigurationat org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.startTriggerValidator(TezSessionPoolSession.java:74)at org.apache.hadoop.hive.ql.e…

数据集成革新:去中心化微服务集群的无限潜能

在当今数据密集型的业务环境下&#xff0c;传统的集中式架构已经难以满足高可用性和高并发性的要求。而去中心化微服务集群则通过分散式的架构&#xff0c;将系统划分为多个小型的、独立部署的微服务单元&#xff0c;每个微服务负责特定的业务功能&#xff0c;实现了系统的高度…

bytesec靶场

靶场下载 https://www.vulnhub.com/entry/hacknos-os-bytesec,393/ 下载完成后进入配置修改网卡 教程 配置 第一步&#xff1a;启动靶机时按下 shift 键&#xff0c; 进入以下界面 第二步&#xff1a;选择第二个选项&#xff0c;然后按下 e 键&#xff0c;进入编辑界面 将…

python快速两两元素求相似矩阵

目录 1. 计算相似度矩阵2. 基于sklearn 1. 计算相似度矩阵 计算相似度矩阵的方法有很多种&#xff0c;发现了sklearn中直接有通过计算余弦相似度得到相似度矩阵的方法 1 sklearn.metrics.pairwise.cosine_similarity # 余弦相似度 2 sklearn.metrics.pairwise.pairwise_distan…

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…

NTN(六) switchover

NTN中的switchover包括feeder link switchover和 serving link switch。所谓feeder link switchover就是将feeder link从source NTN 网关更改为特定 NTN payload的target NTN 网关的过程。 feeder link switchover是网络层过程。 而service link switch则是指serving NTN paylo…

OpenCV分析tfboys十周年演唱会灯牌大战结果

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

【代码质量】认知复杂度(COGNITIVE COMPLEXITY)一种衡量可理解性的新方法

白皮书地址 摘要&#xff1a;圈复杂度最初是作为“可测试性和模块控制流的“可维护性”。虽然它擅长于衡量前者&#xff0c;但它的数学模型不能产生一个令人满意的值来衡量后者。本文描述一种打破数学度量模型的新度量模型来评估代码&#xff0c;以弥补圈复杂度的缺点&#xf…