当前位置: 首页 > 科技观察

面试惊喜:什么是BeanScope?它有几种类型?

时间:2023-03-21 14:08:56 科技观察

作者|雷哥来源|Java面试题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)Spring框架是一个管理bean的IoC容器,bean自然是Spring中的重要资源。bean作用域是什么意思?有多少种类?接下来我们一起来看看吧。PS:Java中的公共类可以称为Beans或JavaBeans。1.作用域bean的作用域是指一个bean在Spring整个框架中的某种行为模式。比如singletonsingletonscope,就是整个Spring中只有一份Bean,全局共享。当有人修改这个值时,另一个人会读取修改后的值。比如我们在Spring中定义一个单例的Bean对象user(默认作用域是单例),具体实现代码如下:@ComponentpublicclassUserBean{@BeanpublicUseruser(){用户.setId(1);user.setName("Java");//这个行为的关键点:用户名是Javareturnuser;}}然后在A类中使用和修改user对象,具体实现代码如下:@ControllerpublicclassAController{@AutowiredprivateUseruser;publicUsergetUser(){用户user=user;user.setName("MySQL");//这个行为的关键点:修改用户名returnuser;}}最后,在B类中也使用了user对象,具体实现代码如下:@ControllerpublicclassBController{@AutowiredprivateUseruser;publicUsergetUser(){用户user=user;返回用户;}}现在我们访问B对象的getUser方法,你会发现此时的用户名是A类中修改后的“MySQL”,而不是原来的“Java”,也就是说Bean对象user默认为scope单身人士的。如果单例对象在任何地方被修改,那么其他类在再次调用时将得到修改后的值。2.作用域分类在Spring中,bean的作用域有五种常见的:singleton:单例作用域。prototype:原型作用域(多实例作用域)。request:请求范围。会话:会话范围。应用:全局范围。注意:后三个作用域只适用于SpringMVC框架。(1)Singleton官方描述:(默认)将单个bean定义作用域为每个SpringIoC容器的单个对象实例。说明:IoC容器中该作用域下的bean只有一个实例:获取的bean(即通过applicationContext.getBean等方法获取)和组装的bean(即通过@Autowired注入)是同一个目的。场景:通常无状态bean使用此范围。无状态是指Bean对象的属性状态不需要更新。注意:Spring默认选择这个范围。(2)Prototype官方描述:将单个bean定义作用域到任意数量的对象实例。说明:每次请求该作用域下的bean都会创建一个新的实例:获取bean(即通过applicationContext.getBean等获取)和组装bean(即通过@Autowired注入)都是new对象实例。场景:通常有状态的bean使用此范围。(3)请求官方描述:将单个bean定义的范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的基础上创建的。仅在web-awareSpringApplicationContext的上下文中有效。说明:每次Http请求都会创建一个新的Bean实例,类似prototype。场景:一个Http请求和响应共享bean。备注:仅限在SpringMVC框架中使用。(4)Session官方描述:ScopesasinglebeandefinitiontothelifecycleofHTTPSession。仅在web-awareSpringApplicationContext的上下文中有效。描述:在一个HttpSession中,定义一个Bean实例。场景:用户会话的SharedBean,例如:记录用户的登录信息。备注:仅限在SpringMVC框架中使用。(5)Applicationofficialdescription:将单个bean定义的范围限定为ServletContext的生命周期。仅在web-awareSpringApplicationContext的上下文中有效。描述:在一个HttpServlet上下文中,定义一个Bean实例。场景:Web应用的上下文信息,例如:记录应用的共享信息。备注:仅限在SpringMVC框架中使用。3.范围设置我们可以通过@Scope注解来设置Bean的范围。有两种设置方式:直接设置作用域的具体值,如:@Scope("prototype")。设置ConfigurableBeanFactory和WebApplicationContext提供的SCOPE_XXX变量,如@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)。具体设置代码如下:总结一个bean的作用域是指一个bean在Spring整个框架中的某种行为模式。Bean的常见作用域有五个:singleton(单例作用域)、prototype(原型作用域)、request(请求作用域)、session(请求作用域)、application(全局作用域),注意后三个功能域只与SpringMVC框架。

最新推荐
猜你喜欢