mirror of
https://gitee.com/many2many/java-web.git
synced 2025-01-11 14:40:55 +08:00
ioc changed
This commit is contained in:
parent
7ebd79065c
commit
d0a8189929
15
README.md
15
README.md
@ -140,10 +140,17 @@
|
|||||||
#### 5.2.4 Spring的应用场景和优势
|
#### 5.2.4 Spring的应用场景和优势
|
||||||
#### 5.2.5 Spring Web
|
#### 5.2.5 Spring Web
|
||||||
### 5.3 Spring IoC(掌握)
|
### 5.3 Spring IoC(掌握)
|
||||||
#### 5.3.1 Spring Bean的定义和生命周期
|
#### 5.3.1 IoC
|
||||||
#### 5.3.2 XML和注解方式的Bean配置
|
#### 5.3.2 Spring IoC容器
|
||||||
#### 5.3.3 Bean的作用域和装配方式
|
#### 5.3.3 Spring Bean的定义和生命周期
|
||||||
#### 5.3.4 使用Spring管理依赖关系
|
#### 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 Spring MVC(掌握)
|
||||||
#### 5.4.1 Spring MVC概述
|
#### 5.4.1 Spring MVC概述
|
||||||
#### 5.4.2 使用@Controller定义控制器
|
#### 5.4.2 使用@Controller定义控制器
|
||||||
|
@ -613,12 +613,26 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意
|
|||||||
|
|
||||||
### 5.3 Spring IoC(掌握)
|
### 5.3 Spring IoC(掌握)
|
||||||
|
|
||||||
#### 5.3.1 Spring Bean的定义和生命周期
|
#### 5.3.1 IoC
|
||||||
- **定义**: Spring Bean是Spring容器管理的对象。
|
|
||||||
|
**定义**: 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
|
```java
|
||||||
@Component
|
@Component
|
||||||
public class MyBean {
|
public class MyBean {
|
||||||
@ -638,60 +652,194 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 5.3.2 XML和注解方式的Bean配置
|
- **XML配置方式定义Bean**:
|
||||||
- **XML配置**:
|
```xml
|
||||||
- **定义Bean**: `<bean>`元素定义一个Bean。
|
<bean id="myBean" class="com.example.MyBean">
|
||||||
- **依赖注入**: 使用`<property>`元素注入依赖。
|
- ```
|
||||||
- **注解配置**:
|
|
||||||
- **组件扫描**: 使用`@ComponentScan`注解来自动发现和配置组件。
|
|
||||||
- **依赖注入**: 使用`@Autowired`、`@Qualifier`等注解来注入依赖。
|
|
||||||
- **示例**:
|
|
||||||
```java
|
|
||||||
@Service
|
|
||||||
public class MyService {
|
|
||||||
private final MyRepository repository;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
public MyService(MyRepository repository) {
|
|
||||||
this.repository = repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void doSomething() {
|
|
||||||
// 使用repository
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 5.3.3 Bean的作用域和装配方式
|
#### 5.3.4 Bean的作用域
|
||||||
- **作用域**:
|
在Spring框架中,默认情况下,如果没有显式指定作用域,Bean的作用域是Singleton。但是,可以通过不同的方式来指定Bean的作用域。
|
||||||
|
|
||||||
|
**作用域**:
|
||||||
- **Singleton**: 单例模式,每个Spring容器中只有一个实例。
|
- **Singleton**: 单例模式,每个Spring容器中只有一个实例。
|
||||||
- **Prototype**: 原型模式,每次请求都会创建一个新的实例。
|
- **Prototype**: 原型模式,每次请求都会创建一个新的实例。
|
||||||
- **Request**: 每次HTTP请求都会创建一个新的实例。
|
- **Request**: 每次HTTP请求都会创建一个新的实例。
|
||||||
- **Session**: 每个HTTP Session都会创建一个新的实例。
|
- **Session**: 每个HTTP Session都会创建一个新的实例。
|
||||||
- **装配方式**:
|
|
||||||
- **构造器注入**: 通过构造器参数注入依赖。
|
|
||||||
- **setter注入**: 通过setter方法注入依赖。
|
|
||||||
- **属性注入**: 通过属性直接注入依赖。
|
|
||||||
|
|
||||||
#### 5.3.4 使用Spring管理依赖关系
|
##### 通过`@Scope`注解指定作用域
|
||||||
- **定义**: Spring通过依赖注入来管理对象之间的依赖关系。
|
|
||||||
- **目的**: 降低组件之间的耦合度,提高代码的可测试性和可维护性。
|
`@Scope`注解可以应用于类级别,以指定Bean的作用域。这是最直接的方法来改变Bean的默认作用域。
|
||||||
- **示例**:
|
|
||||||
```java
|
**示例代码**
|
||||||
@Service
|
|
||||||
public class UserService {
|
```java
|
||||||
private final UserRepository userRepository;
|
package com.lk.demo;
|
||||||
|
|
||||||
@Autowired
|
import org.springframework.context.annotation.Scope;
|
||||||
public UserService(UserRepository userRepository) {
|
import org.springframework.stereotype.Component;
|
||||||
this.userRepository = userRepository;
|
|
||||||
}
|
@Component
|
||||||
|
@Scope("prototype") // 设置作用域为Prototype
|
||||||
public User findUserById(Long id) {
|
public class PrototypeBean {
|
||||||
return userRepository.findById(id).orElse(null);
|
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(掌握)
|
### 5.4 Spring MVC(掌握)
|
||||||
|
|
||||||
|
@ -139,10 +139,17 @@
|
|||||||
#### 5.2.4 Spring的应用场景和优势
|
#### 5.2.4 Spring的应用场景和优势
|
||||||
#### 5.2.5 Spring Web
|
#### 5.2.5 Spring Web
|
||||||
### 5.3 Spring IoC(掌握)
|
### 5.3 Spring IoC(掌握)
|
||||||
#### 5.3.1 Spring Bean的定义和生命周期
|
#### 5.3.1 IoC
|
||||||
#### 5.3.2 XML和注解方式的Bean配置
|
#### 5.3.2 Spring IoC容器
|
||||||
#### 5.3.3 Bean的作用域和装配方式
|
#### 5.3.3 Spring Bean的定义和生命周期
|
||||||
#### 5.3.4 使用Spring管理依赖关系
|
#### 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 Spring MVC(掌握)
|
||||||
#### 5.4.1 Spring MVC概述
|
#### 5.4.1 Spring MVC概述
|
||||||
#### 5.4.2 使用@Controller定义控制器
|
#### 5.4.2 使用@Controller定义控制器
|
||||||
|
Loading…
Reference in New Issue
Block a user