java之路—— Spring IOC 的详解与基本应用

news2024/11/16 15:45:58

在这里插入图片描述

创作不易,给个小在这里插入图片描述支持一下呗

文章目录

  • 前言
  • 一、IOC 基本概念
  • 二、理解IOC
  • 三、基本步骤


在这里插入图片描述

前言

首先在了解ioc之前,我们要先了解Spring的基本概念。
Spring是一个开源的Java应用程序开发框架,它提供了一套全面的解决方案,用于开发企业级应用程序和Java EE应用程序。Spring框架的目标是简化Java应用程序的开发,并提高代码的可维护性和扩展性。
Spring框架提供了许多功能和模块,包括:

IOC容器: Spring的IOC容器可以管理应用程序中的对象,并负责对象之间的依赖注入。它减少了代码中的硬编码依赖关系,使得对象之间的耦合度降低,便于测试和维护。

AOP支持: 通过Spring的AOP(Aspect-Oriented Programming)模块,可以实现横切关注点的分离和集中处理。例如,可以通过AOP实现日志记录、事务管理和安全性等通用功能,而不需要在业务逻辑中显式编写相关代码。

数据访问: Spring提供了对各种数据访问技术的支持,包括JDBC、ORM(对象关系映射)框架(如Hibernate、MyBatis)、NoSQL数据库(如MongoDB)等。这使得开发者可以更方便地与各种数据源进行交互。

集成: Spring框架还提供了对各种企业级应用程序集成技术的支持,包括JMS(Java消息服务)、JMX(Java管理扩展)、邮件发送、任务调度等。

测试支持: Spring框架提供了测试支持模块,帮助开发者编写单元测试和集成测试,并提供对自动化测试的支持。

总之,Spring框架是一个功能强大且灵活的框架,它可以帮助开发者更轻松地构建高质量、可维护和可扩展的Java应用程序。

一、IOC 基本概念

IOC(控制反转)是Spring框架的核心概念之一。它是一种设计原则和软件开发模式,用于管理对象之间的依赖关系。

传统的程序开发中,对象之间的创建和依赖关系由开发者自己控制和管理。而在IOC中,控制权被反转了,即由容器来管理对象的生命周期和依赖关系。
在IOC中,容器负责创建、组装和管理对象,并按需将对象提供给其他对象使用。开发者不需要显式地创建对象,而是通过配置将对象的创建和依赖注入的细节交给IOC容器来处理

在这里插入图片描述

二、理解IOC

其中IOC(控制反转)就是把创建和管理 bean 的过程转移给了第三方,而这个第三方,就是 Spring IoC Container,对于 IoC 来说,最重要的就是容器。

例如:现有类 A 依赖于类 B

传统的开发方式 : 往往是在类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
IoC 思想开发方式 : 不通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面去取即可。
从以上两种开发方式的对比来看:我们 “丧失了一个权力” (创建、管理对象的权力),从而也得到了一个好处(不用再考虑对象的创建、管理等一系列的事情)

可以将Spring IOC简单地理解为“容器自动帮我们管理对象”。

假设你需要在一个Java应用程序中创建多个对象,并且这些对象之间存在依赖关系。传统的方式是你手动进行对象的创建和依赖注入,代码会比较繁琐并且难以维护。
而使用Spring IOC,你只需要通过配置文件或注解来描述这些对象及它们之间的依赖关系,Spring框架会帮你完成对象的创建和依赖注入的工作。这样你就能够专注于业务逻辑的编写,而不需要关心对象的具体实例化过程和对象之间的相互关系。

具体来说,假设有以下两个类:

public class UserService {
    private UserDao userDao;

    // 依赖注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(String username, String password) {
        // 调用依赖的UserDao类的方法
        userDao.save(username, password);
    }
}

public class UserDao {
    public void save(String username, String password) {
        // 实现保存用户数据的逻辑
    }
}

使用Spring IOC,我们可以通过配置文件(例如XML配置)来描述对象之间的依赖关系:

<!-- applicationContext.xml -->
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDao"/>

上述配置中,我们定义了一个名为userService的UserService对象,并将其依赖的UserDao对象通过属性注入方式关联起来。

当应用程序启动时,Spring IOC容器会读取配置文件,并自动创建UserService和UserDao的实例,并将UserDao对象注入到UserService中。这样,我们就可以直接使用userService对象进行业务操作,而无需手动创建对象和处理对象之间的依赖关系。

// 应用程序代码
public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    // 从IOC容器中获取userService对象
    UserService userService = context.getBean("userService", UserService.class);
    
    // 调用userService对象的方法
    userService.add("username", "password");
}


三、基本步骤

下面是Spring IOC的基本应用及相应的代码说明:

引入Spring依赖
首先,在你的项目中引入Spring的相关依赖。可以使用Maven或Gradle等构建工具,在项目的配置文件中添加相应的依赖项。

创建实体类
编写需要被Spring IOC容器管理的实体类。例如,创建一个名为User的简单Java类:

public class User {
    private String name;

    // 省略构造方法和其他方法

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

配置Spring IOC容器
创建一个配置文件(如XML配置文件),用于描述对象的创建和依赖关系。以下示例以XML方式配置:

/**
   xml 配置
*/
<!-- applicationContext.xml -->
<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 id="user" class="com.example.User">
        <property name="name" value="John Doe"/>
    </bean>

</beans>

上述配置文件定义了一个id为user的User对象,并设置了其name属性的初始值为"John Doe"。

使用Spring IOC容器获取对象
在应用程序中,通过Spring IOC容器获取配置好的对象,并使用它们。以下是一个示例代码:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        // 创建Spring IOC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 从IOC容器中获取对象
        User user = context.getBean("user", User.class);

        // 使用对象
        System.out.println("User name: " + user.getName());
    }
}

上述代码中,我们创建了一个Spring IOC容器(ApplicationContext),并指定了前面创建的配置文件。然后,通过getBean方法从容器中获取id为user的User对象,并使用它的getName方法打印出用户的名字。

执行以上代码,输出结果将会是:“User name: John Doe”。

通过以上步骤,我们成功应用了Spring IOC,将对象的创建和依赖关系的管理交给了Spring框架,实现了解耦和灵活性。
除了XML配置方式外,Spring还提供了基于注解的配置方式(如使用@Component、@Autowired等),能够更便捷地进行对象的声明和依赖注入。

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

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

相关文章

从此告别网速慢,轻松掌握浏览器缓存知识点!

文章目录 I. 介绍浏览器缓存的作用提高网页加载速度减少网络带宽消耗优化用户体验 II. 浏览器缓存的原理缓存机制缓存分类1. 强缓存2. 协商缓存 III. 强缓存缓存操作流程缓存过期机制如何设置强缓存 IV. 协商缓存304 Not Modified状态码缓存操作流程如何设置协商缓存 V. 缓存失…

kubernetes核心概念 Pod

Kubernetes集群核心概念 Pod 一、工作负载(workloads) 参考链接&#xff1a;https://kubernetes.io/zh/docs/concepts/workloads/ 工作负载&#xff08;workload&#xff09;是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成&…

第2章-Java基本语法

Java基础知识图解 1. 关键字与保留字 关键字 Java保留字&#xff1a; 现有Java版本尚未使用&#xff0c; 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字 goto 、 const 2. 标识符 Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符…

Elasticsearch:增量快照如何工作?

作者&#xff1a;Lutf ur Rehman Elastic 提供许多由讲师指导的面对面和虚拟现场培训以及点播培训。 我们的旗舰课程是 Elasticsearch 工程师、Kibana 数据分析和 Elastic 可观测性工程师。 所有这些课程都会获得认证。如果你想更多了解这些认证方面的知识&#xff0c;请阅读文…

【CXP协议与CXP测试套件】

CXP协议 CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准&#xff0c;主要用于替代之前的Camera Link协议&#xff0c;常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议&#xff0c;主要用于传输视频和静态…

GO 微信支付V3SDK回调踩坑

通过微信官网提示安装sdk外部库 SDK&#xff0c;工具 | 微信支付商户平台文档中心 下面只讲解微信支付回调部分 先成功下一单微信支付拿到支付回调的数据&#xff0c;方便后续调试 因为在go里面打印请求参数不方便我使用的php打印全部参数&#xff0c; 圈起来的部分是我们需…

centos8.x系统安装K8S,kubernetes集群v1.23.9,docker支持的最后一个版本

1. 部署环境主机&#xff08;条件说明&#xff09; 卸载podman&#xff0c;centos默认安装了podman容器&#xff08;不管有没有&#xff0c;执行下总没错&#xff09;&#xff0c;可能与docker存在冲突 #环境准备 master 192.168.186.128 CentOS Linux release 8.5 (Core) n…

软件接口测试是什么?有哪些好用的接口测试工具?

在软件开发中&#xff0c;接口是不可避免的。软件接口测试是一种验证应用程序接口是否按照设计规范进行交互和协作的测试方法。接口测试是将模块之间的接口连接在一起以进行完整系统测试的关键部分。 当软件开发过程中不同模块之间需要数据交互&#xff0c;采用接口协议来实现…

Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

目录 1、需求背景2、使用Qt键盘事件3、安装事件过滤器4、事件处理级别 1、需求背景 现在有一个类似于下方图的ui&#xff0c;用户需要在输入前一行内容后&#xff0c;需要摁下指定案件能够跳转到下一行继续进行输入。 2、使用Qt键盘事件 一种更为直接的解决方案是子类化QLi…

【SpringCloud-6】Config配置中心

集群环境下&#xff0c;服务节点很多&#xff0c;我们不可能对每个服务都维护一套自己的配置&#xff0c;有修改时把每个节点都改一遍。 所以需要一个公共的配置文件&#xff0c;并且还能实现动态刷新。 在springcloud中&#xff0c;springcloud config组件就是一个配置中心&…

8年测试老鸟整理,软件测试面试问题-初中级,全覆盖问题...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一般测试面试分为…

pytorch动态调整学习率torch.optim.lr_scheduler import MultiStepLR

from torch.optim.lr_scheduler import MultiStepLR 简单来说&#xff0c;就是分阶段调整学习率&#xff0e; 用法&#xff1a; model ANet(classes5) #加载模型 optimizer optim.SGD(params model.parameters(), lr0.05) #优化方法使用SGD#在指定的epoch值&#x…

极端交换————晴问算法

文章目录 1 题目2 思路3 实现 1 题目 2 思路 以此比较最大值、最小值&#xff0c;记录最大、最小值以及其下标位置&#xff0c;结束遍历后&#xff0c;交换其位置。 3 实现 #include<iostream> using namespace std;int main(){int n;scanf("%d", &n);i…

30分钟,认识 html 本质

30分钟&#xff0c;认识 html 本质 html 是什么&#xff1f;html 起源html 发展标签分类空间占用方式布局文本修饰流媒体标签 预定义符号 Symbols弃用的部分标签学习 html html 是什么&#xff1f; HTML的英文全称是 Hyper Text Markup Language&#xff0c;即超文本标记语言。…

redismariadb + keepalived 高可用

目录 机器准备 安装后服务 redis 安装redis mariadb 安装mariadb 启动和配置 互为主从同步配置 keepalived keepalived安装 修改主从 keepalived的配置 主从配置-mariadb监控 主从配置-redis监控 查看和使用 Keepalived Mariadb redis 机器准备 两台机器&…

计算机专业套装书书单推荐

1、深度学习经典教程 深度学习动手学深度学习 “花书”与沐神大作双剑合璧&#xff0c;入门深度学习看这一套就够了&#xff0c;来自一线科学家的经验总结&#xff0c;人工智能机器学习AI算法数据科学领域的重磅作品。理论实战&#xff0c;一套书帮你get深度学习的各种知识。 …

RK3568/RK3588+LinuxCNC+Ethercat解决方案

RK3588是瑞芯微新一代旗舰级高端处理器&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6.0TOPs算力的NPU。 有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的…

IDEA、Webstorm 书签(bookmark)使用

①设置标签 ctrl shift 数字 就可以给软件设置上标签 或者 直接F11就可以添加标签 ②查看设置的标签的位置 使用shift F11 就可以标记记录的标签。

Mysql经典面试题

***搜集到的一些有用的Mysql经典《八股文》&#xff0c;全篇手打&#xff0c;大家觉得有用的话点一个赞&#xff0c;持续更新 目录 1.Mysql锁的机制&#xff1a; 粒度分类&#xff1a; 思想分类&#xff1a; 实现分类&#xff1a; 状态分类&#xff1a; 1.Mysql锁的机制&…

【雕爷学编程】Arduino动手做(130)---5A交流电流模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…