From d0a818992919d1a1f68c0a0f3d76ed627b6158e6 Mon Sep 17 00:00:00 2001 From: many2many <6168830@qq.com> Date: Sun, 27 Oct 2024 12:07:34 +0800 Subject: [PATCH] ioc changed --- README.md | 15 ++- docs/chapter05.md | 250 ++++++++++++++++++++++++++++++++++++---------- docs/index.md | 15 ++- 3 files changed, 221 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 72bd3af..d58de98 100644 --- a/README.md +++ b/README.md @@ -140,10 +140,17 @@ #### 5.2.4 Spring的应用场景和优势 #### 5.2.5 Spring Web ### 5.3 Spring IoC(掌握) -#### 5.3.1 Spring Bean的定义和生命周期 -#### 5.3.2 XML和注解方式的Bean配置 -#### 5.3.3 Bean的作用域和装配方式 -#### 5.3.4 使用Spring管理依赖关系 +#### 5.3.1 IoC +#### 5.3.2 Spring IoC容器 +#### 5.3.3 Spring Bean的定义和生命周期 +#### 5.3.4 Bean的作用域 +#### 5.3.5 Bean的依赖注入 +##### 5.3.5.1 依赖注入 +##### 5.3.5.2 依赖注入的方式 +##### 5.3.5.3 构造器注入 +##### 5.3.5.4 设值注入 +##### 5.3.5.5 字段注入 +##### 5.3.5.6 依赖注入的注解 ### 5.4 Spring MVC(掌握) #### 5.4.1 Spring MVC概述 #### 5.4.2 使用@Controller定义控制器 diff --git a/docs/chapter05.md b/docs/chapter05.md index fbc49ed..6074cd5 100644 --- a/docs/chapter05.md +++ b/docs/chapter05.md @@ -613,12 +613,26 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意 ### 5.3 Spring IoC(掌握) -#### 5.3.1 Spring Bean的定义和生命周期 -- **定义**: Spring Bean是Spring容器管理的对象。 +#### 5.3.1 IoC + +**定义**: IoC是一种设计模式,它通过反转对象之间的依赖关系来降低代码的耦合度。在Spring框架中,IoC通常被称为“依赖注入”(Dependency Injection, DI)。 + +**目的**: 通过将对象的创建和依赖关系管理交给外部容器(在这里是Spring容器),使得对象本身不再负责自身的依赖关系,从而提高代码的可测试性、可维护性和灵活性。 + +#### 5.3.2 Spring IoC容器 + +Spring IoC容器负责管理对象的生命周期、依赖关系以及配置信息。Spring提供了多种容器实现,包括BeanFactory和ApplicationContext。 被IoC容器管理的对象,称为Bean。 + +#### 5.3.3 Spring Bean的定义和生命周期 + +通过使用框架提供的注解或者XML配置,Spring可以轻松地定义和管理Bean。 + - **生命周期**: - **初始化**: 包括默认初始化、自定义初始化等。 - **销毁**: 包括默认销毁、自定义销毁等。 -- **示例**: + +- **注解方式定义Bean的示例**: + ```java @Component public class MyBean { @@ -638,60 +652,194 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意 } ``` -#### 5.3.2 XML和注解方式的Bean配置 -- **XML配置**: - - **定义Bean**: ``元素定义一个Bean。 - - **依赖注入**: 使用``元素注入依赖。 -- **注解配置**: - - **组件扫描**: 使用`@ComponentScan`注解来自动发现和配置组件。 - - **依赖注入**: 使用`@Autowired`、`@Qualifier`等注解来注入依赖。 -- **示例**: - ```java - @Service - public class MyService { - private final MyRepository repository; - - @Autowired - public MyService(MyRepository repository) { - this.repository = repository; - } - - public void doSomething() { - // 使用repository - } - } - ``` +- **XML配置方式定义Bean**: +```xml + +- ``` -#### 5.3.3 Bean的作用域和装配方式 -- **作用域**: +#### 5.3.4 Bean的作用域 +在Spring框架中,默认情况下,如果没有显式指定作用域,Bean的作用域是Singleton。但是,可以通过不同的方式来指定Bean的作用域。 + +**作用域**: - **Singleton**: 单例模式,每个Spring容器中只有一个实例。 - **Prototype**: 原型模式,每次请求都会创建一个新的实例。 - **Request**: 每次HTTP请求都会创建一个新的实例。 - **Session**: 每个HTTP Session都会创建一个新的实例。 -- **装配方式**: - - **构造器注入**: 通过构造器参数注入依赖。 - - **setter注入**: 通过setter方法注入依赖。 - - **属性注入**: 通过属性直接注入依赖。 -#### 5.3.4 使用Spring管理依赖关系 -- **定义**: Spring通过依赖注入来管理对象之间的依赖关系。 -- **目的**: 降低组件之间的耦合度,提高代码的可测试性和可维护性。 -- **示例**: - ```java - @Service - public class UserService { - private final UserRepository userRepository; - - @Autowired - public UserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - public User findUserById(Long id) { - return userRepository.findById(id).orElse(null); - } - } - ``` +##### 通过`@Scope`注解指定作用域 + +`@Scope`注解可以应用于类级别,以指定Bean的作用域。这是最直接的方法来改变Bean的默认作用域。 + +**示例代码** + +```java +package com.lk.demo; + +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component +@Scope("prototype") // 设置作用域为Prototype +public class PrototypeBean { + public PrototypeBean() { + System.out.println("Creating PrototypeBean"); + } +} + +@Component +@Scope("request") // 设置作用域为Request +public class RequestScopedBean { + public RequestScopedBean() { + System.out.println("Creating RequestScopedBean"); + } +} + +``` + +##### 通过`@Bean`方法指定作用域 + +如果你在`@Configuration`类中定义Bean,可以通过`@Bean`方法的参数来指定作用域。 + +**示例代码** + +```java +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; + +@Configuration +public class AppConfig { + + @Bean + @Scope("prototype") // 设置作用域为Prototype + public PrototypeBean prototypeBean() { + return new PrototypeBean(); + } + + @Bean + @Scope("request") // 设置作用域为Request + public RequestScopedBean requestScopedBean() { + return new RequestScopedBean(); + } +} +``` +#### 5.3.5 Bean的依赖注入 + +##### 5.3.5.1 依赖注入 + +依赖注入是一种设计模式,它允许对象在其创建过程中或之后接受其依赖项。Spring框架通过依赖注入机制实现了IoC(Inversion of Control,控制反转),即让Spring容器负责管理Bean之间的依赖关系,将依赖对象注入到目标对象中,而不是在对象内部创建这些依赖对象。 + +##### 5.3.5.2 依赖注入的方式 + +依赖注入可以通过以下几种方式进行: +- **构造器注入(Constructor Injection)** +- **设值注入(Setter Injection)** +- **字段注入(Field Injection)** + +##### 5.3.5.3 构造器注入 + +**定义**:构造器注入是指通过构造器参数来注入依赖项。 + +**优点**: +- 保证了依赖项在对象创建时就已存在,有利于强制依赖项的存在。 +- 更加适合于不可变对象或具有明确依赖关系的对象。 +- 便于单元测试,因为可以在构造函数中传递所有必要的依赖项。 + +**示例**: + +```java + +import org.springframework.stereotype.Service; + +@Service +public class MyService { + + private final MyRepository repository; + + public MyService(MyRepository repository) { + this.repository = repository; + } + + public void doSomething() { + // 使用repository + } +} +``` + +#### 5.3.5.4 设值注入 + +**定义**:设值注入是指通过setter方法来注入依赖项。 + +**优点**: +- 提供了更大的灵活性,可以在对象创建后动态地更改依赖项。 +- 对于可选依赖项特别有用。 + +**缺点**: +- 可能会导致对象的状态不完整,因为在对象创建后可能没有调用setter方法来设置依赖项。 + +**示例**: + +```java +package com.lk.demo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MyService { + + private MyRepository repository; + + @Autowired + public void setRepository(MyRepository repository) { + this.repository = repository; + } + + public void doSomething() { + // 使用repository + } +} +``` + +#### 5.3.5.5 字段注入 + +**定义**:字段注入是指直接在字段上使用注解来注入依赖项。 + +**优点**: +- 代码简洁,易于编写。 + +**缺点**: +- 可能会导致对象的状态不完整,因为依赖项是在对象创建后才注入的。 +- 不利于单元测试,因为依赖项不是通过构造函数传递的。 + +**示例**: + +```java +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MyService { + + @Autowired + private MyRepository repository; + + public void doSomething() { + // 使用repository + } +} +``` + +##### 5.3.5.6 依赖注入的注解 + +除了上述提到的注解之外,还有一些其他的注解可以帮助进行依赖注入: + +- **@Autowired**:自动装配依赖项。如果一个类只有一个构造器,则可以省略此注解。 +- **@Qualifier**:用于消除模糊依赖项,指定要注入的具体Bean。 +- **@Primary**:当存在多个候选Bean时,优先考虑带有`@Primary`注解的Bean。 +- **@Inject**:JSR-330标准注解,用于依赖注入,可以与Spring集成使用。 +- **@Resource**:JSR-250标准注解,通常用于按名称注入Bean。 + ### 5.4 Spring MVC(掌握) diff --git a/docs/index.md b/docs/index.md index cc07e7f..4dff78f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -139,10 +139,17 @@ #### 5.2.4 Spring的应用场景和优势 #### 5.2.5 Spring Web ### 5.3 Spring IoC(掌握) -#### 5.3.1 Spring Bean的定义和生命周期 -#### 5.3.2 XML和注解方式的Bean配置 -#### 5.3.3 Bean的作用域和装配方式 -#### 5.3.4 使用Spring管理依赖关系 +#### 5.3.1 IoC +#### 5.3.2 Spring IoC容器 +#### 5.3.3 Spring Bean的定义和生命周期 +#### 5.3.4 Bean的作用域 +#### 5.3.5 Bean的依赖注入 +##### 5.3.5.1 依赖注入 +##### 5.3.5.2 依赖注入的方式 +##### 5.3.5.3 构造器注入 +##### 5.3.5.4 设值注入 +##### 5.3.5.5 字段注入 +##### 5.3.5.6 依赖注入的注解 ### 5.4 Spring MVC(掌握) #### 5.4.1 Spring MVC概述 #### 5.4.2 使用@Controller定义控制器