Spring IoC 和 DI(如果想知道相关Spring IoC 和 DI的知识,那么只看这一篇就足够了!)

        前言:在现代 Java 开发中,尤其是在使用 Spring 框架时,控制反转(IoC)和依赖注入(DI)是两个至关重要的概念,它们帮助我们实现更加灵活、可维护的代码结构。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

在正式开始讲解之前,先让我们看一下本文大致的讲解内容:

目录

1.Spring IoC

        (1)IoC 的定义

        (2)IoC 的优势

        (3)IoC 的实现方式

        【1】@Component 注解

        【2】@Service 注解

        【3】@Repository 注解

        【4】@Controller 注解

        【5】@Configuration 和 @Bean 注解

2.Spring DI

        (1)Spring DI的简介

        (2)DI 的实现方式

        【1】属性注入(字段注入)

        【2】构造方法注入

        【3】Setter 方法注入

        (3)依赖冲突

        【1】@Primary

        【2】@Qualifier

        【3】@Resource


1.Spring IoC

        首先先让我们学习一下Spring IoC,那么什么是Spring IoC呢?

        (1)IoC 的定义

        控制反转是一种设计原则,其核心思想是将控制权从程序中转移到外部容器中,由框架管理对象的创建和生命周期,在传统的开发中,程序员需要显式地创建和管理对象,而在 IoC 中,Spring容器负责对象的创建与管理。

        ——简单来说Spring IoC就是将之前我们需要自己管理的对象让Spring来进行管理。

        在了解完了Spring IoC的定义之后,让我们了解一下Spring IoC有什么优势吧!

        (2)IoC 的优势

        Spring IoC有以下的优势:

  • 解耦:IoC 的核心优势是解耦,程序员不再负责创建和管理对象,而是将这些职责交给容器,通过 IoC,我们可以更容易地实现不同模块之间的松耦合,提高代码的可维护性。

  • 资源集中管理:所有对象的创建和管理都集中在容器中,这样有助于统一配置、管理对象的生命周期,并能提供全局资源管理。

  • 可扩展性和灵活性:容器提供了很多扩展点,比如切面编程(AOP)等,可以通过 IoC 更容易地为现有代码增加新的功能,而不需要修改原有代码。

        以上就是Spring IoC的优点了!!!

        了解完了Spring IoC的定义和优点之后,那么Spring IoC又该如何去实现呢?

        (3)IoC 的实现方式

        ——在 Spring 中,注解配置是最常用的一种 IoC 实现方式,通过注解,开发者可以将对象交给 Spring 容器管理,并自动注入其依赖,以下是Spring中将对象放入Spring容器中的注解。

【1】@Component 注解

        @Component 是 Spring 中最基本的注解,用于标识一个类是一个 Spring Bean,Spring 会自动扫描和注册带有 @Component 注解的类,并将它们交给容器管理。

@Component
public class MyService {
    public void performService() {
        System.out.println("Service is being performed!");
    }
}

【2】@Service 注解

        ——@Service 注解通常用于标识服务层的组件,它的作用和 @Component 一样,但通常我们使用 @Service 来明确表示该类是一个服务类。

@Service
public class MyService {
    public void performService() {
        System.out.println("Service is being performed!");
    }
}

【3】@Repository 注解

        ——@Repository 注解主要用于标识 DAO(数据访问对象)层的类。

@Repository
public class MyRepository {
    public void save() {
        System.out.println("Data has been saved!");
    }
}

【4】@Controller 注解

        ——@Controller 注解用于标识一个类作为 Spring MVC 的控制器,用于处理 HTTP 请求。

@Controller
public class MyController {
    @RequestMapping("/service")
    public String handleRequest() {
        return "Service is handled!";
    }
}

【5】@Configuration 和 @Bean 注解

        ——在 Spring 中,除了通过 @Component 注解来管理类,还可以使用 @Configuration 注解和 @Bean 注解在 Java 配置类中定义 Bean,@Configuration 表示这是一个配置类,而 @Bean 注解则用于将一个方法的返回值注册为一个 Spring Bean。

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

        以上就是常见的将对象放入Spring容器中的注解方式了!!!

2.Spring DI

        (1)Spring DI的简介

        学习完了Spring IoC之后,在让我们学习一下Spring DI,以下是Spring DI的简介:

        依赖注入(Spring DI)是 Spring IoC 的具体实现方式之一,它指的是在容器运行时动态注入依赖对象。

        看了上边的Spring DI的简介之后,我相信读者还是一头雾水,其实Spring DI就是将放入Spring IoC容器中的对象在取出来放入到一个变量之中。

        (2)DI 的实现方式

        ——在 Spring 中,DI 可以通过多种方式实现,下面是常见的几种方式:

【1】属性注入(字段注入)

        我们可以使用 @Autowired 注解,Spring 会自动注入与字段类型匹配的 Bean,这种实现方式非常简洁,但是其不支持对 final 字段的注入

@Component
public class MyService {
   
   @Autowired
   private MyDependency myDependency; // 自动注入 MyDependency
   
   public void performService() {
       myDependency.execute();
   }
}

【2】构造方法注入

        我们还可以通过构造方法将依赖对象传入,这是最推荐的方式,因为它确保了对象在创建时就有了所有的依赖,并且支持对 final 字段的注入,使对象变得不可变。

@Component
public class MyService {
   
   private final MyDependency myDependency;
   
   @Autowired
   public MyService(MyDependency myDependency) {
       this.myDependency = myDependency;
   }
   
   public void performService() {
       myDependency.execute();
   }
}

【3】Setter 方法注入

        我们还可以通过 Setter 方法注入依赖对象,虽然灵活性较高,但是可能会被多次调用,因此容易导致依赖关系发生变化。

@Component
public class MyService {
   
   private MyDependency myDependency;
   
   @Autowired
   public void setMyDependency(MyDependency myDependency) {
       this.myDependency = myDependency;
   }
   
   public void performService() {
       myDependency.execute();
   }
}

        ——以上就是Spring DI的几种常见使用方式!!!

        (3)依赖冲突

        了解完了Spring DI的几种常见使用方式之后,这里就会有一个问题,那就是在开发中,可能会出现多个 Bean 类型相同,而容器无法决定注入哪个 Bean 的情况,那这时候该如何进行解决呢?

        Spring 提供了几种方式来解决这种冲突:

【1】@Primary

        ——当存在多个相同类型的 Bean 时,Spring 会选择标记为 @PrimaryBean 进行注入

@Component
@Primary
public class MyPrimaryService implements MyService {
    // 实现方法
}

【2】@Qualifier

        ——使用 @Qualifier 注解可以指定注入的 Bean 的名称,这样即使多个 Bean 类型相同,Spring 也能通过名称来进行注入

@Component
public class MyService {

   @Autowired
   @Qualifier("myServiceImpl")
   private MyService myService; // 注入名称为 "myServiceImpl" 的 Bean
}

【3】@Resource

        ——@Resource 是 JDK 提供的注解,它也支持按名称注入,默认按照 Bean 的名称进行注入。若名称不匹配,容器会尝试根据类型进行注入

@Component
public class MyService {
   
   @Resource(name = "myServiceImpl")
   private MyService myService;
   
   public void performService() {
       myService.execute();
   }
}

        ——以上就是几种常见的依赖冲突的解决方式了!!!


以上就是本篇文章的全部内容了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值