Spring(四)先注册后注入
目录
1. 容器中添加组件(Bean Registration)
2. 依赖注入(Dependency Injection, DI)
两者的关系:先注册,后注入
专业流程详解:
代码对比:无容器 vs 有容器
场景:UserService 依赖 UserRepository
总结:
1. 容器中添加组件(Bean Registration)
专业名词:IoC 容器(Inversion of Control Container)是 Spring 的核心,负责管理应用中所有对象的生命周期和依赖关系。
简单解释:
-
添加组件 = 将某个类“注册”到 Spring 容器中,告诉 Spring:“这个类归你管了,它的实例由你创建和维护”。
-
如何操作:用
@Component
、@Service
、@Repository
等注解标记类,或用 XML/Java 配置显式定义 Bean。
示例:
@Service // 将 UserService 注册为容器中的 Bean
public class UserService { ... }
2. 依赖注入(Dependency Injection, DI)
专业名词:依赖注入是 IoC 的实现方式,由容器自动将依赖对象赋值给目标对象。
简单解释:
-
注入 = 容器把已经注册好的 Bean(如
UserRepository
)自动“塞”到另一个 Bean(如UserService
)中,而不是让UserService
自己去找或创建UserRepository
。
示例:
public class UserService {private final UserRepository userRepository;// 构造器注入:容器会把已注册的 UserRepository Bean 传进来public UserService(UserRepository userRepository) {this.userRepository = userRepository; // 注入!}
}
两者的关系:先注册,后注入
-
步骤 1:注册 Bean(Add to Container)
-
只有被注册的类(如
UserService
、UserRepository
)才会被容器管理。 -
类比:超市进货——先把商品(Bean)放进仓库(容器)。
-
-
步骤 2:依赖注入(Inject Dependencies)
-
当容器创建
UserService
时,发现它需要UserRepository
,于是从容器中找一个已注册的UserRepository
Bean,通过构造器、Setter 或字段赋值给它。 -
类比:顾客(
UserService
)要买商品(UserRepository
),超市(容器)直接从仓库拿货给他,无需顾客自己生产商品。
-
专业流程详解:
-
组件注册(Registration)
-
关键接口:
BeanFactory
或ApplicationContext
是 Spring 的 IoC 容器。 -
过程:
-
Spring 扫描到
@Component
等注解时,会创建一个该类的实例(Bean),并存入容器。 -
容器内部维护一个 Bean 定义(BeanDefinition) 的注册表,记录每个 Bean 的类名、作用域、依赖等信息。
-
-
-
依赖注入(Injection)
-
关键机制:
-
依赖查找(Dependency Lookup):容器根据类型(或名称)查找匹配的 Bean。
-
依赖绑定(Dependency Binding):将找到的 Bean 赋值给目标对象的依赖项。
-
-
触发时机:
-
当容器初始化时,会递归解析所有 Bean 的依赖关系,完成注入。
-
-
代码对比:无容器 vs 有容器
场景:UserService
依赖 UserRepository
-
无容器(手动管理依赖)
// 自己创建依赖!
UserRepository repository = new UserRepository();
UserService service = new UserService(repository); // 手动传参
-
问题:紧耦合、难以替换实现、测试困难。
-
有容器(自动注入)
// 注册组件
@Repository
public class UserRepository { ... }@Service
public class UserService {private final UserRepository repository;public UserService(UserRepository repository) {this.repository = repository; // 容器自动注入}
}// 使用时直接从容器获取 Bean
ApplicationContext context = ...;
UserService service = context.getBean(UserService.class); // 依赖已自动注入!
优势:解耦、依赖可配置、易于测试。
总结:
-
注册组件:告诉 Spring 容器“这个类归你管”(用
@Component
等)。 -
依赖注入:容器自动把已管理的 Bean 赋值给其他 Bean 的依赖项(通过构造器、Setter 等)。
-
核心关系:
-
没有注册 → 容器不认识这个类,无法注入。
-
注册但未注入 → 容器知道这个类,但不会自动赋值给其他 Bean。
-
一句话:
容器是仓库,注册是进货,注入是取货送货。只有先“进货”(注册 Bean),才能“送货”(注入依赖)!