杠精派
派聪明
0/512

热门评论

嘿嘿 2026年09月01日 14:30
引用原文:,在 singleton Bean 中注入 prototype Bean 时要小心,因为 singleton Bean 只创建一次,所以 prototype Bean 也只会注入一次。这时候可以用 @Lookup 注解或者 ApplicationContext 来动态获取。
@派聪明 还是有点不明白,这两个不是作用域不同吗怎么可以注入你
点赞
回复1 取消回复
派聪明 2026年09月01日 14:31
# 为什么 singleton 里能注入 prototype Bean? 这是个很好的问题!关键点在于:**注入发生在 Bean 创建的那一刻,而不是每次使用的时候**。 ## 注入的时机当 Spring 创建 singleton Bean(比如 SingletonService)时,会一次性完成它的所有依赖注入。此时容器发现它需要 PrototypeBean,就创建一个 PrototypeBean实例注入进去。 ```java@Componentpublic class SingletonService { @Autowired private PrototypeBean prototypeBean; // 只在 SingletonService 创建时注入一次} ``` 从这之后,**SingletonService 全局只有这一个实例**,它内部的 prototypeBean 字段也就不会再变了——虽然 PrototypeBean声明为 prototype作用域,但它实际上“注入的那次”只发生了一次。 类比理解:就像你把一件“一次性”的东西装进了一个“终身不换”的盒子里,虽然那件东西设计成用一次就该换新的,但盒子永远不打开重新装,你拿到的永远是那一件。 ## 结果这会导致一个“违背预期”的现象:你以为每次用 prototypeBean 都是新实例,实际上每次拿到的都是**同一个**对象,prototype 的语义失效了。 ## 解决办法**1. `@Lookup` 注解**:Spring 会动态重写这个方法,每次调用都从容器获取新实例: ```java@Componentpublic class SingletonService { @Lookup public PrototypeBean getPrototypeBean() { return null; // Spring 会重写此方法,返回新实例 } } ``` **2. 直接注入 ApplicationContext动态获取**: ```java@Autowiredprivate ApplicationContext context; public void doSomething() { PrototypeBean bean = context.getBean(PrototypeBean.class); //每次都是新实例} ``` ## 小结- 能注入 ≠ 每次都新建,注入只在 singleton Bean初始化时执行一次; -想让 prototype语义生效,就要**每次主动向容器要**(@Lookup 或 getBean),而不是依赖一次性注入。
点赞
回复 取消回复

6 条评论

嘿嘿 2026年09月01日 16:22
引用原文: SpringBoot Starter?
@派聪明 这个是什么
点赞
回复1 取消回复
派聪明 2026年09月01日 16:23
**Spring Boot Starter** 是 Spring Boot提供的一种依赖管理机制,简单来说就是一组“预打包的依赖集合”。 **核心作用**:把实现某个功能所需的所有 jar 包和自动配置打包成一个 starter,开发者只需引入一个依赖,就能开箱即用,不用自己一个个找 jar 包、管版本、写配置。 **举个例子**:想在项目中开发 Web接口,只需引入: ```xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 这一个依赖就包含了 Spring MVC、内嵌 Tomcat、Jackson(JSON处理)等所有相关组件,且版本都是兼容的。 **工作原理**: 1. Maven 解析 starter 的依赖树,自动下载相关 jar 包; 2. 每个 starter 包含自动配置类,通过 `@Conditional`系列注解判断条件是否满足; 3. Spring Boot启动时读取 `META-INF/spring.factories`(2.7+ 为 `AutoConfiguration.imports`)文件,加载自动配置类; 4. 条件满足时自动创建并注册相应的 Bean。 **常用 Starter**: - `spring-boot-starter-web`:Web 开发- `spring-boot-starter-data-redis`:Redis 操作- `spring-boot-starter-test`:测试支持- `spring-boot-starter-security`:安全认证**命名规范**:官方 starter 为 `spring-boot-starter-xxx`,第三方自定义 starter建议命名为 `xxx-spring-boot-starter`。 这就是 Spring Boot “约定大于配置”理念的重要体现,极大简化了 Spring 应用的搭建和开发。
点赞
回复 取消回复
嘿嘿 2026年09月01日 15:24
引用原文:Field injection is not recommended”。
@派聪明 这个是什么
点赞
回复 取消回复
嘿嘿 2026年09月01日 14:30
引用原文:,在 singleton Bean 中注入 prototype Bean 时要小心,因为 singleton Bean 只创建一次,所以 prototype Bean 也只会注入一次。这时候可以用 @Lookup 注解或者 ApplicationContext 来动态获取。
@派聪明 还是有点不明白,这两个不是作用域不同吗怎么可以注入你
点赞
回复1 取消回复
派聪明 2026年09月01日 14:31
# 为什么 singleton 里能注入 prototype Bean? 这是个很好的问题!关键点在于:**注入发生在 Bean 创建的那一刻,而不是每次使用的时候**。 ## 注入的时机当 Spring 创建 singleton Bean(比如 SingletonService)时,会一次性完成它的所有依赖注入。此时容器发现它需要 PrototypeBean,就创建一个 PrototypeBean实例注入进去。 ```java@Componentpublic class SingletonService { @Autowired private PrototypeBean prototypeBean; // 只在 SingletonService 创建时注入一次} ``` 从这之后,**SingletonService 全局只有这一个实例**,它内部的 prototypeBean 字段也就不会再变了——虽然 PrototypeBean声明为 prototype作用域,但它实际上“注入的那次”只发生了一次。 类比理解:就像你把一件“一次性”的东西装进了一个“终身不换”的盒子里,虽然那件东西设计成用一次就该换新的,但盒子永远不打开重新装,你拿到的永远是那一件。 ## 结果这会导致一个“违背预期”的现象:你以为每次用 prototypeBean 都是新实例,实际上每次拿到的都是**同一个**对象,prototype 的语义失效了。 ## 解决办法**1. `@Lookup` 注解**:Spring 会动态重写这个方法,每次调用都从容器获取新实例: ```java@Componentpublic class SingletonService { @Lookup public PrototypeBean getPrototypeBean() { return null; // Spring 会重写此方法,返回新实例 } } ``` **2. 直接注入 ApplicationContext动态获取**: ```java@Autowiredprivate ApplicationContext context; public void doSomething() { PrototypeBean bean = context.getBean(PrototypeBean.class); //每次都是新实例} ``` ## 小结- 能注入 ≠ 每次都新建,注入只在 singleton Bean初始化时执行一次; -想让 prototype语义生效,就要**每次主动向容器要**(@Lookup 或 getBean),而不是依赖一次性注入。
点赞
回复 取消回复
Solitary 2026年06月30日 14:37
引用原文: @MdcDot 注解
这个注解是什么作用
点赞
回复 取消回复

目录