Spring--IOC--DI--单例模式

spring:

     spring是一个容器,可以接管各个层次的Bean,  并且可以配置bean之间的关系

     使用Bean在ApplicationContext.xml中进行配置bean的id即可

     spring是以来反射机制的,所以bean中的Id一定要写全

IOC:

     控制反转,把创建对象和维护对象的权限转移到Spring容器中(ApplicationContext.xml),程序本身不再维护

DI:

     依赖注入,与IOC是一个概念。因为在ApplicationContext.xml配置文件中bean和bean之间通过ref来维护的时候是相互依赖的,所以又叫做依赖注入。也就是控制反转

ApplicationContext非常消耗内存,所以一个项目只有一个实例----单例模式

  什么是到单例模式:

    使用过spring的程序猿应该都知道,我们的bean(controller、service和Dao,实体bean除外)都是通过spring的IOC容器统一管理的,同时这些bean都是默认单例的,即一个bean在一个IoC容器中就只有一个实例。这一点跟设计模式中的单例略有不同,在单例模式中的单例是在整个应用中只有一个实例。

     我们把bean放在IOC容器中统一进行管理,只在初始化加载的时候实例化一次,一方面提高了效率,另一方面大大降低了内存开销。spring的依赖反转原则降低了程序之间的耦合性,也提交了我们的开发效率,不用每次都手动去new了。单例模式确实有很多优点,但是说到单例我们就会想到线程安全,并发访问情况下spring中bean是线程安全的吗?

     到底是不是线程安全的,要根据实际场景判断。为什么这么说呢?首先,大多数时候客户端都在访问我们应用中的业务对象,而这些业务对象并没有做线程的并发限制,因此不会出现各个线程之间的等待问题,或是死锁问题。这一部分不在考虑。

     再有就是成员变量这一重要因素了。在并发访问的时候这些成员变量将会是并发线程中的共享对象,也是影响线程安全的重要因素。成员变量又分为基本类型的成员变量和引用类型的成员变量。

     其中引用类型的成员变量即我们在controller中注入的service,在service中注入的dao,这里将其定义为成员变量主要是为了实例化进而调用里面的业务方法,在这些类中一般不会有全局变量,因此只要我们的业务方法不含有独立的全局变量即使是被多线程共享,也是线程安全的。刚刚说了service层和dao层一般不会有全局变量,这里主要针对于controller层。基本类型成员变量的定义又分为两种情况:如果此成员变量是final类型修饰的不可被修改的,则仍是线程安全的。另外一种情况就是不安全的了,解决方法:要么把全局变量定义成局部的, 要么修改controller的单例模式把它定义成prototype类型的。从文中开始我们就提到过,实体bean不是单例的,并没有交给spring来管理,每次我们都手动去new一个实例。从客户端传递到后台的controller-->service-->Dao,这一个流程中,即使处理我们提交数据的业务处理类是被多线程共享的,但是他们处理的数据并不是共享的,数据是每一个线程都有自己的一份,所以在数据这个方面是不会出现线程同步方面的问题的。

 

 

此文为转发,原链接上一位也没写>_<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值