前言
首先在了解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等),能够更便捷地进行对象的声明和依赖注入。