spring之scope(作用域)

版权声明:转载请注明出处!! https://blog.csdn.net/IPI715718/article/details/85675060

spring有以下五种作用域

1、singleton(单例模式),当一个bean的作用域被设置为singleton时,也就意味着ioc容器中只会创建该类型的一个实例bean,如果没有设置懒加载lazy-init,bean创建的过程一般都发生在容器的初始化过程(ioc容器的资源定位,载入,注册)中,每一次请求ioc容器返回的都是这个唯一存在的实例bean。  

配置:

<bean id="role" class="com.pojo.Role" scope="singleton"></bean>

测试

ApplicationContext applicationContext = 
				new ClassPathXmlApplicationContext("classpath:spring/applicationContext3.xml");
		Role role1 = (Role)applicationContext.getBean("role");
		Role role2 = (Role)applicationContext.getBean("role");
		System.out.println(role1==role2);

测试结果

true

返回结果为true,也就是说两个引用的对象的地址相同,也就意味着引用指向的是同一个对象。

插曲:这里看一下我说的  如果没有设置懒加载lazy-init,bean创建的过程一般都发生在容器的初始化过程(ioc容器的资源定位,载入,注册)中。这是springioc容器初始化过程中的一个条件判断,true就会创建bean。

if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()){
    ......
}

2、prototype(原型),当一个bean的作用域被设置成prototype时, bean的作用域被设置成的原型模式也就是说ioc容器中不存在唯一的该bean,并且该bean的创建不发生在ioc容器的初始化过程中(即使设置成lazy-init,bean也不会在ioc容器初始化时创建,根据上面的插曲),而是在每次一次请求时都会创建一个bean实例,换句话说也就是在每一次对该bean的注入或者getBean,都会new一个新的bean出来,然后交给客户端。

配置:

<bean id="role" class="com.pojo.Role" scope="prototype"></bean>

测试

ApplicationContext applicationContext = 
				new ClassPathXmlApplicationContext("classpath:spring/applicationContext3.xml");
		Role role1 = (Role)applicationContext.getBean("role");
		Role role2 = (Role)applicationContext.getBean("role");
		System.out.println(role1==role2);

结果

false

false,说明引用指向的不是同一地址,也就是说两次得到的对象不是同一对象。

3、request,request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:

如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可: 


<web-app>
   ...
  <listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
   ...
</web-app>

如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现: 

<web-app>
 ..
 <filter> 
    <filter-name>requestContextFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
 </filter> 
 <filter-mapping> 
    <filter-name>requestContextFilter</filter-name> 
    <url-pattern>/*</url-pattern>
 </filter-mapping>
   ...
</web-app>

接着既可以配置bean的作用域了: 

<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>

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

配置实例:

和request配置实例的前提一样,配置好web启动文件就可以如下配置: 

<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>

5、global session

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。

配置实例:

和request配置实例的前提一样,配置好web启动文件就可以如下配置: 

<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>

猜你喜欢

转载自blog.csdn.net/IPI715718/article/details/85675060