全当知识要点记录了,大家随意踩踩。
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();