龙华区深圳北站,泉州四方网站开发,软件开发培训方案,公司网站修改方案Bean的作用域
scope的属性值
属性值作用singleton默认单例prototype原型每调用一次getBean()方法则获取一个新的Bean对象 , 每次注入的时候都是新对象request一个请求对应一个Bean仅限于在WEB应用中使用 , 需要引入web的框架如SpringMvc(global) session一个会话对应一个Bean…Bean的作用域
scope的属性值
属性值作用singleton默认单例prototype原型每调用一次getBean()方法则获取一个新的Bean对象 , 每次注入的时候都是新对象request一个请求对应一个Bean仅限于在WEB应用中使用 , 需要引入web的框架如SpringMvc(global) session一个会话对应一个Bean仅限于在WEB应用中使用 , 需要引入web的框架如SpringMvcglobal sessionportlet应用中专用的, portlet和servlet都是规范, servlet运行在servlet容器中如Tomcat, portlet运行在portlet容器中application一个应用对应一个Bean仅限于在WEB应用中使用websocket一个websocket生命周期对应一个Bean仅限于在WEB应用中使用自定义scope很少使用
scope属性值singleton(单例)
Spring的IoC容器中默认情况下Bean对象是单例的
Bean对象的创建是在初始化Spring上下文的时候就完成的 , 执行getBean()方法的时候Bean对象已经创建好了 , 每次获取操作的都是那个单例的Bean对象
public class SpringBean {public SpringBean() {System.out.println(SpringBean的无参数构造方法执行);}
}?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--默认情况下Bean对象是单例的,scopesingleton可以省略--bean idsb classcom.powernode.spring6.beans.SpringBean /
/beansTest
public void testScope(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-scope.xml);SpringBean sb1 applicationContext.getBean(sb, SpringBean.class);//com.powernode.spring6.beans.SpringBean5b239d7dSystem.out.println(sb1);//com.powernode.spring6.beans.SpringBean5b239d7dSpringBean sb2 applicationContext.getBean(sb, SpringBean.class);System.out.println(sb2);
}scope属性值prototype(多例)
如果想让Spring的Bean对象以多例的形式存在可以在bean标签中指定scope属性的值为prototype
初始化Spring上下文时不会创建这些prototype的Bean对象 , 只有每一次执行getBean()方法的时候才会创建调用几次创建几次 , 每次获取的都是新的对象
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idsb classcom.powernode.spring6.beans.SpringBean scopeprototype /
/beansTest
public void testScope(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-scope.xml);//com.powernode.spring6.beans.SpringBean29445a7SpringBean sb1 applicationContext.getBean(sb, SpringBean.class);System.out.println(sb1);//com.powernode.spring6.beans.SpringBean67d48005SpringBean sb2 applicationContext.getBean(sb, SpringBean.class);System.out.println(sb2);
}自定义线程级别Scope(了解)
第一步: 自定义Scope实现Scope接口,实现在同一个线程中获取的Bean都是同一个, 跨线程获取的是不同的Bean对象
Spring内置了实现Scope接口的线程范围的类org.springframework.context.support.SimpleThreadScope
第二步: 使用CustomScopeConfigurer内置类将自定义的Scope注册到Spring容器中
bean classorg.springframework.beans.factory.config.CustomScopeConfigurer!--设置scopes属性,这个属性是个map集合表示可以指定多个线程范围--property namescopesmap!--自定义线程名--entry keymyThread!--这个Scope接口的实现类使用的是Spring内置的,也可以自己定义--bean classorg.springframework.context.support.SimpleThreadScope//entry/map/property
/bean第三步: 使用自定义线程的Scope
bean idsb classcom.powernode.spring6.beans.SpringBean scopemyThread /Test
public void testCustomScope(){//主线程ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-scope.xml);SpringBean sb1 applicationContext.getBean(sb, SpringBean.class);SpringBean sb2 applicationContext.getBean(sb, SpringBean.class);//com.powernode.spring6.beans.SpringBean5b236d7dSystem.out.println(sb1);//com.powernode.spring6.beans.SpringBean5b236d7dSystem.out.println(sb2);// 启动新线程new Thread(new Runnable() {Overridepublic void run() {SpringBean a applicationContext.getBean(sb, SpringBean.class);SpringBean b applicationContext.getBean(sb, SpringBean.class);//com.powernode.spring6.beans.SpringBean29445a6System.out.println(a);//com.powernode.spring6.beans.SpringBean29445a6System.out.println(b);}}).start();
}