当前位置:首页>正文

spring管理bean时默认的单例是线程安全的吗 13,spring bean默认是单例吗spring框架中的单例beans是线程安全的么

2023-05-24 18:46:22 互联网 未知

spring管理bean时默认的单例是线程安全的吗


1、Bean的简介
在Spring中,那些组成应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
2、Bean的作用域
创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方(recipe)”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张“处方”就可以创建多个实例。
不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext)。
1)singleton
当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

13,spring bean默认是单例吗?spring框架中的单例beans是线程安全的么

Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。 但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。 如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。 最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”

Spring MVC中自定义的单例Bean是线程安全的吗

spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有prototype类型 按其作用域来讲有sigleton,prototype,request,session,global session。 spring中的单例与设计模式里面的单例略有不同,设计模式的单例是在整个应用中只有一个实例...

spring mvc线程安全吗

springmvc是线程不安全的
------------------------------
springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。

当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。

SpringMVC和Struts是线程安全的吗?为什么

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

spring为什么是线程安全的

Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式。
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法)。


public class PersonController{    
    private PersonService personService    

    public void setFirstName(HttpServletRequest request){                    
        personService.setFirstName(request.getParameter("firstname"))    
    }    

    public String getFirstName(){             
        return   personService.getFirstName()    
    }

}当有两个线程访问PersonController时,一个先调用setFristName来设置firstname, 而另一个线程调用getFirstName就会得到第一个线程所设的值。这是因为,PersonController是缺省情况下为单一实例(Singleton),而personService也是一个单独的实例被注入到personController里。这种情况下,多线程是不安全的,除非能够保证每个方法(method)都不会改变所共享的对象的属性或状态。
线程安全的方法
public class PersonController {   

    private PersonService personService

    public void setFirstName(HttpServletRequest request){        
      Person person = new Person()        
      person.setFirstName()        
      personService.savePerson(person)    
    }
 }上面的例子是一种线程安全的写法,例如,线程A访问setFirstName方法,当它执行到person.setFirstName()后,系统决定挂起这个线程,转向执行B,B做了同样的事情并保存。然后,系统再执行被挂起的A线程,由于A线程有自己的堆栈状态,而且它本身没有与其他线程共享的对象实例或状态。需要补充说一下,这里假定personService.savePerson()方法是线程安全的,否则,还需要调查personService.savePerson()是否线程安全。
因此,在大多数情况下,spring bean是非线程安全的,或者说,如果你不告诉它如何管理对象或方法的线程安全,那么就会潜在线程安全问题。
spring bean因此给出了以下的线程安全的可用声明(annotation),你可以根据实际情况,分别定义你的类或方法。

相关文章