天天看点

spring中BEAN的作用域范围

Spring Bean作用域介绍:

singleton:SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例

Property: 每次请求都创建一个实例

request: 在一次Http请求中,容器会返回该Bean的同一个实例,而对于不同的用户请求,会返回不同的实例。需要注意的是,该作用域仅在基于Web的Spring ApplicationContext情形下有效,以下的session和global Session也是如此

session:同上,唯一的区别是请求的作用域变为了session

global session:全局的HttpSession中,容器会返回该bean的同一个实例,典型为在是使用portlet context的时候有效(这个概念本人也不懂)

注意:如果要用到request,session,global session时需要配置

servlet2.4及以上:

在web.xml中添加:

<listener>

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

</listener>

servlet2.4以下:

需要配置一个过滤器

<filter>

<filter-name>XXXX</filter-name>

<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>

<filter-mapping>

<filter-name>XXXX</filter-name>

<url-pattern>

public class CurrentTime {

private Calendar now = Calendar.getInstance();

public void printCurrentTime() {

System.out.println("Current Time:" + now.getTime());

}

}

package com.huyong.lookup;

public abstract class LookupBean {

private CurrentTime currentTime;

public CurrentTime getCurrentTime() {

return currentTime;

}

public void setCurrentTime(CurrentTime currentTime) {

this.currentTime = currentTime;

}

public abstract CurrentTime createCurrentTime();

}

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="currentTime" class="com.huyong.lookup.CurrentTime"

scope="prototype">

</bean>

<bean id="lookupBean" class="com.huyong.lookup.LookupBean"

scope="singleton">

<lookup-method name="createCurrentTime" bean="currentTime" />

<property name="currentTime" ref="currentTime"></property>

</bean>

</beans>

Main Test:

package com.huyong.lookup;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.xml.XmlBeanFactory;

import org.springframework.core.io.ClassPathResource;

public class LookupMain {

public static void main(String[] args) throws Exception {

ClassPathResource resource = new ClassPathResource(

"applicationContext.xml");

BeanFactory factory = new XmlBeanFactory(resource);

LookupBean lookupBean = (LookupBean) factory.getBean("lookupBean");

System.out.println("----------first time---------");

System.out.println("getCurrentTime:");

lookupBean.getCurrentTime().printCurrentTime();

System.out.println("createCurrentTime:");

lookupBean.createCurrentTime().printCurrentTime();

Thread.sleep(12345);

System.out.println("---------second time---------");

System.out.println("getCurrentTime:");

LookupBean lookupBean02 = (LookupBean) factory.getBean("lookupBean");

lookupBean02.getCurrentTime().printCurrentTime();

System.out.println("createCurrentTime:");

lookupBean02.createCurrentTime().printCurrentTime();

}

}

感觉Spring的东西比较杂,学好spring一定要明白反射和代理是怎么回事!

渐渐的也挺会到了Spring的好处!

简单就是美!!