@Scope注解用法介绍


prtyaa
prtyaa 2023-12-25 12:29:21 62693
分类专栏: 资讯

今天给大家分享Spring中@Scope注解的用法,希望对大家能有所帮助!

  1. @Scope 定义以及作用

@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作用域:基本作用域:singleton(单例)、prototype(多例);Web 作用域(reqeust、session、globalsession),自定义作用域。

  1. @Scope 作用域类型

2.1 @Scope("singleton")

单实例属于默认作用域,IOC容器启动的时候就会调用方法创建对象,以后每次获取都是从Spring容器当中拿同一个对象(map当中)。

2.2 @Scope("prototype")

多实例,在IOC容器启动创建的时候,并不会直接创建对象放在容器中去,当你需要调用的时候,才会从容器当中获取该对象然后进行创建。

2.3 @Scope("request")

同一个请求创建一个实例

2.4 @Scope("session")

同一个session创建一个实例

2.5 @Scope("globalsession")

同一个globalsession创建一个实例

  1. 示例演示

3.1 新建Person.java

 

package com.spring.bean; public class Person { private String name; private Integer age; private String address; public Person(String name, Integer age, String address) { this.name = name; this.age = age; this.address = address; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age='" + age + '\'' + ", address='" + address + '\'' + '}'; }}

 

 

 

3.2 新建配置类 TestScopeConfig.java

package com.spring.config; import com.spring.bean.Person;import org.springframework.beans.factory.config.ConfigurableBeanFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Scope; @Configuration public class TestScopeConfig { @Bean @Scope("singleton") //@Scope("prototype") public Person person() { System.out.println("容器添加Person对象......"); return new Person("小孙", 28, "西安"); }}

 

 

 

3.3 新建测试类 TestScope.java

package com.spring.test; import com.spring.bean.Person;import com.spring.config.TestBeanConfig;import com.spring.config.TestScopeConfig;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestScope { public static void main(String[] args) { //配置文件方式 AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestScopeConfig.class); Object person1 = annotationContext.getBean("person"); Object person2 = annotationContext.getBean("person"); System.out.println(person1); System.out.println(person2); boolean flag = person1 == person2; if (flag) { System.out.println("是同一个对象"); } else { System.out.println("不是同一个对象"); } } }

 

 

 

4、输出效果

4.1 @Scope("prototype")

输出结果:

 

容器添加Person对象...... Person{name='小孙', age='28', address='西安'} Person{name='小孙', age='28', address='西安'} 是同一个对象

 

 

4.2 @Scope("prototype")

输出结果:

 

容器添加Person对象...... 容器添加Person对象...... Person{name='小孙', age='28', address='西安'} Person{name='小孙', age='28', address='西安'} 不是同一个对象

 

 

5、@Scope注解的使用场景

目前有90%以上的业务系统都使用singleton单实例,因此spring也默认的类型也是singleton,singleton虽然保证了全局是一个实例,对性能有所提高,但是如果实例中有非静态变量时,可能会导致线程安全、共享资源的竞争等问题。

当设置为prototype多实例时:每次连接请求,都会重新生成一个新的bean实例,这也会导致一个问题,当请求数越多,性能会降低,因为频繁创建的新的实例,会导致GC频繁,GC回收时长增加。要根据实际情况选择哪一种方式。

 

 

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=30153
赞同 0
评论 0 条
prtyaaL0
粉丝 1 发表 2554 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1447
银河麒麟打印带有图像的文档时出错  1364
银河麒麟添加打印机时,出现“server-error-internal-error”  1150
统信桌面专业版【如何查询系统安装时间】  1072
统信操作系统各版本介绍  1069
统信桌面专业版【全盘安装UOS系统】介绍  1027
麒麟系统也能完整体验微信啦!  984
统信【启动盘制作工具】使用介绍  626
统信桌面专业版【一个U盘做多个系统启动盘】的方法  574
信刻全自动档案蓝光光盘检测一体机  483
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!