JAVA:理解 Spring IOC 与依赖注入

请关注微信公众号:拾荒的小海螺
博客地址:http://lsk-ww.cn/

1、简述

在现代的 Java 开发中,Spring 框架的核心思想之一就是控制反转(Inversion of Control,IoC)。IoC 是一种软件设计原则,它将对象的创建、组装和管理的责任从应用程序代码转移到了框架。Spring IoC 容器负责创建对象并将它们相互关联,从而实现了对象之间的解耦和灵活性。本文将介绍 Spring IoC 的概念、工作原理,并举例说明常见的应用场景。

在这里插入图片描述

2、什么是 Spring IoC?

IoC 是一种设计原则,它反转了传统应用程序中对象的创建和依赖关系的控制方式。在传统的应用程序中,如果一个对象需要依赖另一个对象,通常会直接在代码中创建这个依赖对象,从而导致对象之间紧密耦合。而在 IoC 容器中,应用程序的控制权被反转了,对象的创建和依赖关系由容器负责管理和维护,应用程序只需要关注自身的业务逻辑。

Spring IoC 的核心是依赖注入(Dependency Injection,DI)。依赖注入是 IoC 的一种具体实现方式,它通过将对象的依赖关系通过构造函数、setter 方法或字段注入到对象中,从而实现了对象之间的解耦和灵活性。

3、工作原理

Spring IoC 容器负责管理应用程序中的所有对象(bean),包括创建、销毁和维护它们之间的依赖关系。Spring IoC 容器通过以下方式实现控制反转:

  • 配置元数据:通过 XML 配置文件、Java 注解或基于 Java 的配置类来描述应用程序中的对象及其依赖关系。

  • Bean 定义:将每个对象(bean)的定义信息注册到 IoC 容器中,包括类名、作用域、依赖关系等。

  • 实例化对象:IoC 容器根据配置信息和依赖关系,动态地创建和管理对象的实例。

  • 注入依赖:IoC 容器将对象之间的依赖关系注入到对象中,使得对象可以通过依赖关系来访问和使用其他对象。

在这里插入图片描述

4、应用场景

以下列举常用的IOC使用样例​:

4.1 依赖注入
public class UserService {

    private UserRepository userRepository;

    // 通过构造函数注入依赖
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 通过 setter 方法注入依赖
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 业务方法
    public void addUser(User user) {
        userRepository.save(user);
    }
}
4.2 声明 Bean

通过 XML 配置文件或 Java 注解声明 bean,并将其注册到 IoC 容器中,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="userRepository" class="com.example.repository.UserRepositoryImpl" />

    <bean id="userService" class="com.example.service.UserService">
        <property name="userRepository" ref="userRepository" />
    </bean>

</beans>

Java 注解示例:

@Configuration
public class AppConfig {

    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }

    @Bean
    public UserService userService() {
        UserService userService = new UserService();
        userService.setUserRepository(userRepository());
        return userService;
    }
}
4.3 AOP(面向切面编程)

通过 IoC 容器管理切面和目标对象,实现横切关注点的解耦和重用:

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logMethodCall(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Calling method: " + methodName);
    }
}
4.4 事务管理

通过 IoC 容器管理事务,实现对业务方法的事务控制:

@Service
@Transactional
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void addUser(User user) {
        userRepository.save(user);
    }
}

5、总结

Spring IoC(控制反转)通过将对象的创建和依赖关系管理交给 IoC 容器来实现了代码的解耦和灵活性,是 Spring 框架的核心之一。本文介绍了 Spring IoC 的概念、工作原理,并举例说明了常见的应用场景样例,希望对读者理解和应用 Spring IoC 提供了帮助。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾荒的小海螺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值