Spring 框架入门介绍及IoC的三种注入方式

news2024/11/19 21:35:50

目录

一、Spring 简介

1. 简介

2. spring 的核心模块 ⭐

 

 二、IoC 的概念

2.1 IoC 详解

2.2 IoC的好处

2.3 谈谈你对IoC的理解

 

三、IoC的三种注入方式

3.1 构造方法注入

3.2 setter方法注入

3.3 接口注入(自动分配)

3.4 spring上下文与tomcat整合

3.5 总结


一、Spring 简介

1. 简介

        Spring框架是 Java 平台的一个开源的全栈(full-stack)应用程序框架和控制反转容器实现,一般被直接称为 Spring。它由Rod Johnson创建,去搜索了它的资料很难想象Rod Johnson之前是学音乐。该框架的一些核心功能理论上可用于任何 Java 应用,它还为基于Java企业版平台构建的 Web 应用提供了大量的拓展支持。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了 企业级JavaBeans(EJB)模型。

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

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

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

范围:任何Java应用

2. spring 的核心模块 ⭐

  1. 控制反转(IoC):Spring通过IoC容器管理应用程序中的对象依赖关系。它将对象的创建、组装和管理工作交给了容器,开发人员只需要关注业务逻辑的实现。

  2. 面向切面编程(AOP):Spring支持AOP,可以将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高代码的模块化和可重用性。

  3. 数据访问支持:Spring提供了对各种数据访问技术的支持,包括JDBC、ORM(如Hibernate、MyBatis)、JPA等。它简化了数据访问层的开发,提供了事务管理和异常处理等功能。

  4. Web开发支持:Spring提供了一套全面的Web开发框架,包括Spring MVC和Spring WebFlux。它们可以帮助开发人员构建灵活、高效的Web应用程序。

  5. 安全性支持:Spring提供了一套强大的安全性框架,可以用于认证、授权和安全性管理。它支持各种认证方式,如基于表单、基于HTTP基本认证、基于OAuth等。

        此外,Spring还提供了许多其他功能和扩展,如缓存支持、消息队列、调度任务等。它的模块化设计使得开发人员可以根据需要选择使用的功能,从而提高开发效率。

 二、IoC 的概念

2.1 IoC 详解

  • Spring框架中的IoC(Inversion of Control,控制反转)是指将对象的创建、依赖关系的管理和对象的生命周期等控制权从应用程序代码中转移到框架中。在IoC的概念下,对象的创建和管理不再由开发人员直接控制,而是由Spring容器来负责。
  • IoC的核心思想是通过依赖注入(Dependency Injection,DI)来实现对象之间的解耦。依赖注入是指在对象创建的过程中,将其所依赖的其他对象的引用注入到对象中,从而实现对象之间的关系建立和协作。通过依赖注入,对象不再负责自己依赖对象的创建和查找,而是由容器来完成。
  • Spring框架中的IoC容器负责管理对象的生命周期和依赖关系。它通过配置文件(如XML配置文件)或注解的方式描述对象之间的依赖关系,并在应用程序启动时将这些对象实例化并组装起来。开发人员只需要定义对象的行为,而无需关心对象的创建和管理过程。

2.2 IoC的好处

  1. 解耦:通过依赖注入,对象之间的依赖关系被明确地声明在配置文件或注解中,使得对象之间的耦合度降低,提高了代码的可维护性和可测试性。

  2. 简化对象的创建和管理:由容器负责对象的创建和生命周期管理,开发人员只需关注对象的行为逻辑,而无需手动管理对象的创建和销毁。

  3. 提供灵活的配置方式:通过配置文件或注解,可以方便地修改对象之间的依赖关系,实现灵活的配置和组装。

  4. 支持AOP(Aspect-Oriented Programming):Spring框架提供了面向切面编程的支持,可以通过IoC容器将横切逻辑(如日志、事务管理等)与业务逻辑分离,提高了代码的模块化和可维护性。

2.3 谈谈你对IoC的理解

        Spring框架中的IoC(控制反转)通过依赖注入实现对象之间的解耦,将对象的创建和管理交由容器负责。使用IoC容器可以简化对象的创建和管理过程,提高代码的可维护性和可测试性。通过灵活的配置方式,可以方便地修改对象之间的依赖关系。同时,IoC容器的存在也为AOP提供了支持,使得横切逻辑与业务逻辑分离,提高了代码的模块化和可维护性。

三、IoC的三种注入方式

3.1 构造方法注入

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

示例代码:

1. 编写一个接口定义修改用户信息的方法

package com.ycxw.ioc.service;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-16 22:28
 */
public interface UserService {
    /**
     * 方法功能:修改用户信息
     */
    public void edit();
}

2. 编写一个service类来实现这个接口中的方法

package com.ycxw.ioc.service.impl;

import com.ycxw.ioc.service.UserService;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-16 22:29
 *
 */
public class UserServiceImpl1 implements UserService {
    @Override
    public void edit() {
        System.out.println("更改了用户的信息");
    }
}

3. 编写控制器(action)进行调用并编写无参和有参构造方法

package com.ycxw.ioc.web;

import com.ycxw.ioc.service.UserService;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-16 22:30
 *
 */
public class UserAction {
    private UserService userService;

    public UserAction() {
    }

    public UserAction(UserService userService) {
        this.userService = userService;
    }

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

🌟4. 编写spring.xml配置文件,用于定义和配置Spring应用程序的组件、依赖关系、行为和其他相关配置。它是Spring框架的核心配置文件之一。

  1. 定义Bean:在spring.xml文件中,可以使用XML配置元素来定义应用程序中的Bean对象。通过配置Bean的类路径、构造函数,Spring容器可以根据配置文件中的定义来创建和管理Bean对象。

  2. 配置依赖注入:spring.xml文件可以指定Bean之间的依赖关系,通过配置构造函数注入,将依赖的Bean (userService) 注入到目标Bean (userAction) 中,实现依赖注入。这样可以实现对象之间的解耦,提高代码的灵活性和可测试性。

<?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.ycxw.ioc.web.UserAction" id="userAction">
        <constructor-arg name="userService" ref="userService"></constructor-arg>
    </bean>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

5. 测试

package com.ycxw.ioc.test;

import com.ycxw.ioc.web.UserAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-16 22:35
 */
public class demo1 {
    public static void main(String[] args) {
        //加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
        //(强转)应用指定对象
        UserAction userAction = (UserAction) context.getBean("userAction");
        //调用修改用户信息方法
        userAction.edits();
    }
}

3.2 setter方法注入

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

示例代码:

1. 修改了控制器(action)

package com.ycxw.ioc.web;

import com.ycxw.ioc.service.UserService;

/**
 * @author 云村小威
 * @site blog.csdn.net/Justw320
 * @create 2023-08-14 18:40
 *
 */
public class UserAction {
    private UserService userService;

       public UserService getUserService() {
        return userService;
    }

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

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

2. 修改了bean注入的方式 (property)

<?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.ycxw.ioc.web.UserAction" id="userAction">
     <property name="userService" ref="userService"></property>
    <bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>

 

3.3 接口注入(自动分配)

三、这里请注意byType 和 byName 的区别:

1. byType(按类型自动装配):

  • byType模式下,Spring容器会根据属性的类型来查找与之匹配的Bean,并将其自动注入到对应的属性上。
  • 例如,如果一个属性的类型为userService,Spring容器会查找实现了userService接口的Bean,并将其注入到该属性上。
  • 要使用byType模式,目标Bean的属性类型必须与其他Bean的类型匹配,并且在容器中只能有一个匹配的Bean。

2. byName(按名称自动装配):

  • byName模式下,Spring容器会根据属性的名称来查找与之匹配的Bean,并将其自动注入到对应的属性上。
  • 例如,如果一个属性名为myBean,Spring容器会查找名称为myBean的Bean,并将其注入到该属性上。
  • 要使用byName模式,目标Bean的属性名称必须与其他Bean的名称匹配。

 

3.4 spring上下文与tomcat整合

        在用户每一次发送任意请求,在对应请求处理代码中可以获取到spring容器中配置的任意的JavaBean,从而获取对应的javabean中定义的方法。

实现思路:

  1. 在tomcat启动的时候自动去加载spring的上下文(ApplicationContext)
  2. 利用监听器去把spring的上下文放到tomcat的上下文中
  3. 为了解决框架的配置文件冲突的问题,我们需要动态指定spring上下文的配置文件名称

 

示例代码:

1. 编写SpringLoadListener 监听器

package com.ycxw.ioc.listener;

import org.springframework.context.ApplicationContext;
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 blog.csdn.net/Justw320
 * @create 2023-08-16 10:25
 */
@WebListener
public class SpringLoadListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //加载spring核心配置文件(建模,这个spring的上下文对象),上下文对象中可以获取任何javabean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
        //获取tomcat上下文
        ServletContext servletContext = sce.getServletContext();
        //把srping的上下文放入tomcat中
        servletContext.setAttribute("springContext",context);
    }
}

2. 编写servlet测试

package com.ycxw.ioc.web;

import com.ycxw.ioc.service.UserService;
import org.springframework.context.ApplicationContext;

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 blog.csdn.net/Justw320
 * @create 2023-08-16 10:29
 */
@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的上下文对象
        ApplicationContext springContext = (ApplicationContext ) req.getServletContext().getAttribute("springContext");
        //拿到userService的Bean
        UserService userAction = (UserService) springContext.getBean("userService");
        System.out.println(userAction);
        userAction.edit();
    }
}

 

3. 用户处理结果后打印输出

 

3.5 总结

        Spring框架提供了三种主要的依赖注入方式:构造函数注入、Setter方法注入和字段注入。构造函数注入通过构造函数来注入依赖对象,Setter方法注入通过setter方法来注入依赖对象,字段注入通过直接注入字段来实现依赖注入。这些注入方式可以单独使用,也可以结合使用,具体选择可以根据实际需求和个人偏好来决定。

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

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

相关文章

ChatGPT聊天微信小程序源码/适配H5和WEB端

ChatGPT-MP(基于ChatGPT实现的微信小程序&#xff0c;适配H5和WEB端) 可二开包含前后台&#xff0c;支持打字效果输出流式输出&#xff0c;支持AI聊天次数限制&#xff0c;支持分享增加次数等功能。开源版禁止商用&#xff0c;仅供学习交流&#xff0c;禁止倒卖。 技术栈&…

本地linux 搭建云服务器

本人穷逼&#xff0c;三年268 腾讯云可以接受&#xff0c;续费千百块 承担不起 研究了一会&#xff0c;发现搭建云服务器有两种较好的方式 一种是有公网IP的&#xff0c;另外是没有公网IP的&#xff0c;这里实验成功的是没有公网ip的方法 这种方法有缺点&#xff0c;因为fre…

前端组件高级封装技巧--纯干货

对于前端的小伙伴来说&#xff0c;最常见的工作就是写后台管理系统的页面&#xff0c;而后台管理系统最多的操作就是CRUD了&#xff0c;类似下面的&#xff0c;一个搜索框&#xff0c;一个表格&#xff0c;一个分页&#xff0c;然后点击新增编辑有个弹框 当你写过一段时间的CRU…

OpenDDS安装教程 Java开发

一、环境搭建 1、版本介绍 笔者使用以下版本&#xff08;不同版本的openDDS对应ACETAO版本不同&#xff09; openDDS&#xff1a;3.14 ACETAO&#xff1a;6.5.12 perl&#xff1a;5.32.0.1-64bit Visual Studio&#xff1a;Community 2019 jdk&#xff1a;jdk-8u111-windows-…

spark的standalone 分布式搭建

一、环境准备 集群环境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安装 zookeeper 和 HDFS 1、启动zookeeper -- 启动zookeeper(11,12,13都需要启动) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己写的脚本-- 查看进程 jps -- 有…

【CTF-web】备份是个好习惯(查找备份文件、双写绕过、md5加密绕过)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/83.html 经过扫描可以找到index.php.bak备份文件&#xff0c;下载下来后打开发现是index.php的原代码&#xff0c;如下图所示。 由代码可知我们要绕过md5加密&#xff0c;两数如果满足科学计数法的形式的话&a…

centos7离线安装gdal3.6.3

本文档以纯离线环境为基础&#xff0c;所有的安装包都是提前下载好的。以gdal3.6.3为例&#xff08;其他版本安装步骤或方式可能不同&#xff09;&#xff0c;在centos7系统离线安装&#xff0c;并运行java项目&#xff0c;实现在java服务中调用gdal库解析地理数据。以下任意组…

python的 __all__ 用法

一、介绍 在Python中&#xff0c;__all__通常用于定义模块的公开接口。在使用from module import *语句时&#xff0c;此时被导入模块若定义了__all__属性&#xff0c;则只有__all__内指定的属性、方法、类可被导入&#xff1b;若没定义&#xff0c;则导入模块内的所有公有属性…

华为公开“倒装芯片封装”创新技术,改善散热性能,火龙秒变冰龙

根据华为技术有限公司公开的专利申请&#xff0c;他们提出了一项名为“具有改进的热性能的倒装芯片封装”的创新技术。这项技术旨在改善各种专利应用设备的散热性能&#xff0c;涉及的芯片类型包括CPU、GPU、FPGA和ASIC等。 这些设备可以是智能手机、平板电脑、可穿戴移动设备、…

CUDA计算超时(TDR)和阻塞界面问题的处理参考方法

本文提供一种解决单个英伟达独立显卡(终端用户常见的情形)上计算密集导致程序崩溃和电脑界面卡死的问题参考方法,采取降低效率和花费更多时间的思路来解决崩溃和卡顿的问题,即让CPU占有率不是一直100%,也不会因为被TDR机制打断。 如上图,在GPU-Z软件中看到“GPU Load”没…

实施统一待办:如何将“人找事变成事找人”

当企业信息化发展到一定程度&#xff0c;往往会呈现一种局面&#xff1a;专业的咖&#xff0c;管专业的事。如HRM管企业的人事信息、SRM管企业与供应商之间的合作关系、CRM管企业与客户之间的互动和沟通等。 然而当这些系统叠加在一起时&#xff0c;奇妙的化学反应产生了&#…

C#工程建立后修改工程文件名与命名空间

使用之前的项目做二次开发&#xff0c;项目快结束的时候&#xff0c;需要把主项目的名称修改成我们想要的。 之前从来没有这么干过&#xff0c;记录一下。 步骤如下&#xff1a; 1&#xff1a;打开vs2010项目解决方案&#xff0c;重命名&#xff0c;如下图所示&#xff1a; …

stack 、 queue的语法使用及底层实现以及deque的介绍【C++】

文章目录 stack的使用queue的使用适配器queue的模拟实现stack的模拟实现deque stack的使用 stack是一种容器适配器&#xff0c;具有后进先出&#xff0c;只能从容器的一端进行元素的插入与提取操作 #include <iostream> #include <vector> #include <stack&g…

猿人学刷题系列(第一届比赛)——第三题

题目&#xff1a;抓取下列5页商标的数据&#xff0c;并将出现频率最高的申请号填入答案中 地址&#xff1a;https://match.yuanrenxue.cn/match/3 本题主要考察请求逻辑&#xff0c;可以借助fiddler或Charles等抓包工具进行分析。首先通过浏览器来简单进行请求逻辑分析。 从抓…

Linux系统下消息中间件RocketMQ下载、安装、搭建、配置、控制台rocketmq-dashboard的安装保姆级教程 rocketmq ui

这里给出我使用的 RocketMQ 版本&#xff08;5.1.3&#xff09;、RocketMQ-Dashboard 版本的百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1HaKBBDGWZ0WKLGgVwIG9pw 提取码&#xff1a;1234 文章目录 一. 官网下载安装二、启动NameServer三、启动Broker四…

Linux学习之初识Linux

目录 一.Linux的发展历史及概念 1.什么是Linux UNIX发展的历史&#xff1a; Linux发展历史&#xff1a; 2. 开源 商业化发行版本 二. 如何搭建Linux环境 Linux 环境的搭建方式主要有三种&#xff1a; 1. 直接安装在物理机上 2. 使用虚拟机软件 3. 使用云服务器 三. …

4.SpringCloud

1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局锁&#xff0c;…

【游戏评测】河洛群侠传一周目玩后感

总游戏时长接近100小时&#xff0c;刚好一个月。 这两天费了点劲做了些成就&#xff0c;刷了等级&#xff0c;把最终决战做了。 总体感觉还是不错的。游戏是开放世界3D游戏&#xff0c;Unity引擎&#xff0c;瑕疵很多&#xff0c;但胜在剧情扎实&#xff0c;天赋系统、秘籍功法…

读书笔记 |【项目思维与管理】➾ 成功的项目需要有效的管理

读书笔记 |【项目思维与管理】➾ 成功的项目需要有效的管理 一、项目:一项难以完成的使命二、要管理项目先要理解"管理"三、项目管理成功的标准四、使项目利益相关者满意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 如果你没有…

Activity启动模式中的生命周期

彻底明白Activity启动模式中的生命周期&#xff0c;从此不再成为面试难点。 参考&#xff1a; https://www.zhihu.com/tardis/zm/art/429845377?source_id1003 https://developer.aliyun.com/article/951609 https://cloud.tencent.com/developer/article/1763205 Activity…