【Spring】bean的作用域

在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。

在大多数情况下,单例bean是很理想的方法。初始化和垃圾回收对象实例所带来的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理。

有写时候,我们所使用的类是易变的(mutable),它们会保持一些状态,因此重用是不安全的。在这种情况下将class声明为单例的bean就不是很好了,因为对象会被污染

Spring定义了多种作用域,可以基于这些作用域创建bean,包括:

  • 单例(singleton):在整个应用中,只创建bean的一个实例。
  • 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
  • 会话(Session):在Web应用中,为每个会话创建一个bean实例。
  • 请求(Request):在Web应用中,为每个请求创建一个bean实例。

单例是默认的作用域,但是对于易变的类型这是不合适的。如果选择其他的作用域,要使用@Scope注解,它可以与@Component或@Bean一起使用。

如下是分别对@Component和@Bean使用@Scope注解

 

【计算机网络】时延、发送时延、传输时延、处理时延、排队时延、时延带宽积

时延:指数据从网络的一端传送到另一端所需的时间

发送时延(传输时延):是主机或路由器发送数据帧所需要的时间,也就是从发送数据帧的第一个比特算起,到该帧的最后一个比特发送完毕所需的时间,发送时延 = 数据帧长度(b) / 信道带宽(b/s)

传播时延:是电磁波在信道中传播一定的距离需要花费的时间,传播时延 = 信道长度(m) / 电磁波在信道上的传播速率(m/s)

发送时延(传输时延)发生在机器的内部的发送器中,而传播时延则发生在机器外部的传输信道媒体上。

处理时延:主机或路由器在收到分组时要花费一定的时间进行处理,例如分析分组的首部、从分组中提取数据部分、进行差错或查找适当的路由等等

排队时延:分组在经过网络传输时,要经过许多的路由器。但分组在进入路由器后要现在输入队列中排队等待处理。在路由器确定了转发接口后,还要在输出队列中排队等待转发

数据在网络中经历的总时延就是以上四种时延之和:总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延

时延带宽积:时延带宽积 = 传播时延 * 带宽

【例】考虑两台主机A和主机B由一条带宽为R bps、长度为M米的链路互连,信号传播速率为V m/s。假设主机A从t=0时刻开始向主机B发送分组,分组长度为L比特。试求:

1) 传播延迟(时延)dp;

2) 传输延迟dt;

3) 若忽略结点处理延迟和排队延迟,则端到端延迟de是多少?

4) 若dp>dt,则t=dt时刻,分组的第一个比特在哪里?

5) 若V=250000km/s,L=512比特,R=100 Mbps,则使带宽时延积刚好为一个分组长度(即512比特)的链路长度M是多少?

(注:1k=10^3,1M=10^6)

【解】1)传播时延dp = 信道长度(m) / 电磁波在信道上的传播速率(m/s) = M / V

2)传输延迟dt = 数据帧长度(b) / 信道带宽(b/s) = L / R

3)总延迟de = 传播时延 + 传输延迟 = M / V + L / R

4)dp > dt意味着最早发送的信号没有到达目的主机之前,数据分组的最后一个比特已经发送出来了,所以分组的第一个比特在距离主机的V * dt米的链路上

5)时延带宽积 = 传播时延 * 带宽 = M / V * R = 512,解之得M = 1280米