前言:在现代 Java 开发中,尤其是在使用 Spring 框架时,控制反转(IoC)和依赖注入(DI)是两个至关重要的概念,它们帮助我们实现更加灵活、可维护的代码结构。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
在正式开始讲解之前,先让我们看一下本文大致的讲解内容:
目录
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 会选择标记为 @Primary
的 Bean
进行注入
@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();
}
}
——以上就是几种常见的依赖冲突的解决方式了!!!
以上就是本篇文章的全部内容了!!!