在默认情况下,Spring App上下文中所有Bean都是单例(singleton)的形式创建。不管给定的一个bean被注入多少次,每次所注入的都是同一个实例。
Bean 作用域
- 单例(Singleton):在整个应用中,只创建bean的一个实例(默认作用域)
- 原型(Prototype):每次注入或者通过Spring App上下文获取的时候都会创建新的bean实例
- 会话(Session):在Web应用中,为每个会话创建一个Bean实例
- 请求(Request):在Web应用中,为每个请求创建一个Bean实例
如何指定Bean的作用域
| @Bean |
| @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) |
| public Notepad notepad(){ |
| return new Notepad(); |
| } |
| <bean id="notepad" class="com.myapp.Notepad" scope="prototype"/> |
使用会话和请求作用域
在Web应用中,如电子商务应用中的购物车Bean如果是单例的话会导致所有用户都会向一个购物车中添加商品。另一个方面如果购物车是原型作用域在应用中其他的地方不会出现造成资源浪费。
| @Component |
| @Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.INTERFACES) |
| public ShoppingCart cart(){...} |
| |
| |
proxyMode=ScopedProxyMode.INTERFACES;
表明这个代理要实现ShoppingCart接口,并将调用委托给实现bean。如果Bean的类型就是具体类而不是接口则需要改变属性值proxyMode=ScopedProxyMode.TARGET_CLASS
来表明要以生成目标类扩展的方式创建代理。

作用域代理能够延迟注入请求和会话作用域的Bean
| <bean id="cart" class="com.myapp.ShoppingCart" scope="session"> |
| <aop:aspect-proxy proxy-target-class="false"/> |
| </bean> |
实现运行时注入
| |
| @Bean |
| public CompactDisc sgtPeppers(){ |
| return new BlankDisc("Sgt, Pepper's Lonely", "The Beatles"); |
| } |
| |
| <bean id="sgtPeppers" |
| class="soundsystem.BlankDisc" |
| c:_title="xxx" |
| c:_artist="xxx"/> |
Spring提供两种运行时注入值的方式
注入外部值
| @Configuration |
| @PropertySource("classpath:/com/soundsystem/app.properties") |
| public class BlankDisc{ |
| @Autowired |
| Environment env; |
| @Bean |
| public BlankDisc disc(){ |
| return new BlankDisc(env.getProperty("disc.title"),env.getProperty("disc.artist")); |
| } |
| } |
| |
| |
| |
| |
Spring的Environment中存在四种getProperty()重载的变种形式
- String getProperty(String key)
- String getProperty(String key, String defaultValue)
- T getProperty(String key, Class type)
- T getProperty(String key, Class type, T defaultValue)
属性占位符(Property placeholder)
| |
| <bean id="sgtPeppers" class="soundsystem.BlankDisc" c:_title="${disc.title}" c:_artist="${disc.artist}"/> |
| |
| |
| public BlankDisc{@Value("${disc.title}") String title, @Value("${disc.artist}") String artist){ |
| this.title = title; |
| this.artist = artist; |
| } |
| |
| |
| <context:property-placeholder/> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具