Spring 注解之 @Scope @Lazy
一、@Scope注解详细信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @Target ({ElementType.TYPE, ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) @Documented public @interface Scope { // scopeName和value属性互为别名,使用哪一个属性进行赋值,效果都是一样的 @AliasFor ( "scopeName" ) String value() default "" ; /** * Specifies the name of the scope to use for the annotated component/bean. * <p>Defaults to an empty string ({@code ""}) which implies // 创建的是单实例对象 * {@link ConfigurableBeanFactory#SCOPE_SINGLETON SCOPE_SINGLETON}. * @since 4.2 // 创建的是多实例对象 * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE * @see ConfigurableBeanFactory#SCOPE_SINGLETON // 一次请求创建一个实例对象 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST // 一次会话创建一个实例对象 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION * @see #value */ @AliasFor ( "value" ) String scopeName() default "" ; ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT; } |
二、@Scope注解的取值
1、可以从上面看出value的取值如下:
sigleton:创建单实例对象,每次获取的都是同一个对象
prototype:创建多实例对象,每次获取的都是不同的对象
request:一次请求创建一个实例对象
session:一次会话创建一个实例对象
2、测试@Scope("singleton")
配置类
1 2 3 4 5 6 7 8 9 10 11 | @Configuration @ComponentScan (value= "com.spring01" ) public class SpringConfiguration { // Spring容器的默认值就是singleton @Scope ( "singleton" ) @Bean ( "xiaomao" ) public Person person(){ System.out.println( "创建Person对象" ); return new Person( "xiaomao" , 21 ); } } |
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class SpringDemo { @Test public void springTest01() { // 如果不设置@Scope或者@Scope("singleton")或者@Scope(value="singleton")或者@Scope(scopeName="singleton") // 那么启动容器的时候便会创建对象,以后去获取就是从IOC容器中去取,并且每一次都拿的是同一个对象 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration. class ); System.out.println( "IOC容器创建完成" ); Person bean1 = context.getBean( "xiaomao" , Person. class ); Person bean2 = context.getBean( "xiaomao" , Person. class ); System.out.println(bean1 == bean2); } } |
测试结果
1 2 3 | 创建Person对象 IOC容器创建完成 true |
结果分析:当@Scope("singleton")时,容器启动完成的时候便会创建对象,并注入到Spring容器中,交由Spring进行管理,每次获取对象的时候从IOC容器中直接获取,通过bean1==bean2可以看出,创建的对象是单实例的,它们就是同一个对象.
3、测试@Scope("prototype")
测试结果
1 2 3 4 | IOC容器创建完成 创建Person对象 创建Person对象 false |
结果分析:如果将@Scope的值设置为prototype,那么在IOC容器启动完成的时候不会去创建对象,只有在获取对象的时候才会去创建对象,并且每一次获取对象都是不同的对象
三、@Lazy
该注解的作用就是启用Spring的懒加载功能,当容器启动完成之后不会去创建对象,只有在真正的获取对象的时候才会创建该对象的实例
1 2 3 4 5 6 7 8 9 10 11 12 | @Configuration @ComponentScan (value= "com.spring01" ) public class SpringConfiguration { // IOC容器创建完成时不会直接创建对象,只有在获取对象时才去创建对象 @Lazy @Scope ( "singleton" ) @Bean public Person xiaomao(){ System.out.println( "创建Person对象" ); return new Person( "xiaomao" , 21 ); } } |
分类:
Spring 常用注解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?