Spring中bean的作用域及Spring容器初始化的相关问题

全当知识要点记录了,大家随意踩踩。

spring的作用域有以下几种
singleton作用域
prototype作用域
request作用域
session作用域
global-session作用域

1. singleton作用域 scope="singleton" 默认值
bean设置为该作用域时,Spring IOC容器中只会存在一个共享的bean实例,也就意味着Spring IOC容器只会创建该bean定义的唯一实例。
这个单一实例会被存储到单例缓存(singleton cache)中。

2. prototype作用域 scope="prototype"
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean())都会产生一个新的bean
实例,相当于一个new操作。
注意:Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,
随后就对 prototype实例不闻不问了。此时清楚任何prototype作用域的对象并释放其所持有的昂贵资源,都是客户端代码的职责。

注意:request作用域、session作用域、global-session作用域使用的时候首先要在初始化web的web.xml中做以下配置
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
3. request作用域
表示该作用域下,针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP-request内有效

4. session作用域
session作用域表示针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP-session内有效

5. global-session作用域

全局会话内有效



Spring中bean的作用域:
        在Spring容器中,bean的作用域范围默认是单例模式的,singleton,单例模式可以由多个线程并发访问,如果

我们想改变bean的作用域范围,将其改变为多例模式,即每次从容器中获取相同的bean时,都是新的bean,而不

是获得两次相同的bean,其内存地址相同,为true。那么在配置文件中设置bean的作用域范围,Spring容器通过

scope="prototype"来将bean的作用域设置为多例模式。如下:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" scope="prototype"></bean>

Spring容器初始化相关问题:

        在Spring容器中,默认情况下,容器启动时初始化所有容器中的bean,但是我们可以指定bean节点的lazy-

init="true"来延迟初始化bean,这时只有在获取该bean时,才会初始化bean。如:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" lazy-init="true"></bean>
  如果想对所有Spring容器中的bean都应用延迟初始化,可以在根节点<beans/>设置default-lazy-

init="true".如下:
<beans default-lazy-init="true" />

        在Spring中,当bean的作用域范围是默认的单例模式时,bean会在Spring容器启动时就初始化,如果bean的作用域范围是多例模式的,bean的初始化是在调用该bean的实例时,由beanfactory初始化。如果想在容器启动时,延迟单例模式bean的初始化,则应该按照上一点的方法。

 

        如果想在bean被初始化的同时,让bean所对应的类的相应方法执行,比如:调用该类的初始化方法,或者打开某一数据库连接等,应该怎么办呢?在bean节点中为我们提供了init-method属性,该属性用来指定bean初始化时

,同时该bean所对应的类的某一方法同时执行,该属性的值是对应类中的某一方法。如下:<bean id="userDAO"

class="com.aptech.dao.impl.UserDAOImpl" init-method="getConn"></bean>
当然,如果我们想在gaibean销毁时,也同时执行gaibean对应类的某一方法,Spring也提供了一个属性:

destroy-method,该方法将在bean被销毁之前调用,该属性的值也是对应类的某一方法,如:
<bean id="userDAO" class="com.aptech.dao.impl.UserDAOImpl" destroy-method="closeAll"></bean>

        怎样测试bean在容器启动时是否初始化?因为大多数bean的创建都是通过类构造器来实例化的,所以在bean对应的类中的构造函数中输出一句话,之后创建一个Spring容器,看是否输出构造方法中的话,如果输出则证明在

Sping容器启动时bean就初始化了,如果没有输出则……

思考:bean什么时候被销毁呢? 在Spring容器关闭的时候被销毁。
      那怎样关闭Spring容器呢?使用一个抽象类AbstractApplicationContext ,如下:
 AbstractApplicationContext context = new ClassPathXmlApplicationContext

("applicationContext.xml");
 // 关闭Spring容器
 context.close();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xcl119xxcl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值