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:请求范围;session:会话范围;应用:全局范围。注意:后三个作用域只适用于SpringMVC框架。2.1Singleton官方描述:(默认)将单个bean定义作用域为每个SpringIoC容器的单个对象实例。说明:该作用域下的Bean在IoC容器中只有一个实例:获取Bean(即通过applicationContext.getBean等方法获取)和组装Bean(即通过@Autowired注入)是同一个对象.场景:通常无状态bean使用此范围。无状态是指Bean对象的属性状态不需要更新。注意:Spring默认选择这个范围。2.2Prototype官方描述:将单个bean定义作用域到任意数量的对象实例。说明:每次对该scope下的Bean的请求都会创建一个新的实例:GetBean(即通过applicationContext.getBean等方法获取)和assemblyBeans(即通过@Autowired注入)都是新的对象实例。场景:通常有状态的bean使用此范围。2.3请求官方描述:将单个bean定义的范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的基础上创建的。仅在web感知SpringApplicationContext的上下文中有效。说明:每次Http请求都会创建一个新的Bean实例,类似prototype。场景:一个Http请求和响应共享bean。备注:仅限在SpringMVC框架中使用。2.4Session官方描述:ScopesasinglebeandefinitiontothelifecycleofanHTTPSession。仅在web-awareSpringApplicationContext的上下文中有效。描述:在一个HttpSession中,定义一个Bean实例。场景:用户会话的SharedBean,例如:记录用户的登录信息。备注:仅限在SpringMVC框架中使用。2.5应用程序官方描述:将单个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框架。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
