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

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

b94a3d3ebe5f4d1b881308c4ced512ae.jpg


前言


首先在了解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容器来处理。

56ba8aa316884071a600798d5e2634d9.jpg


二、理解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等),能够更便捷地进行对象的声明和依赖注入。

目录
相关文章
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
25 2
|
11天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
20天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
13天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
28 3
|
14天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
28 0
|
5天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
13天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
4天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
4天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
3天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
下一篇
无影云桌面