-
懒加载适用场景:
如果某个Bean在程序整个运行周期都可能不会被使用,那么可考虑设定该Bean为懒加载。
优点:尽可能的节省了资源。
缺点:可能会导致某个操作响应时间增加。
查看全部 -
实现懒加载的两种方式:
为某个Bean设置懒加载
为所有Bean设置懒加载
查看全部 -
Bean的懒加载概念:
Spring容器会在创建容器时,提前初始化Singleton(单例)作用域的bean,但是如果Bean被标注了lazy-init=“true,则该Bean只有在其在被需要的时候才会被初始化。
注意:只对Singleton(单例)作用域的bean有效,其他作用域如多例并不知道什么这个bean才会被需要实例化。
查看全部 -
代码回顾
SimpThreadScope
查看全部 -
代码回顾
自定义作用域(spring.xml部分)
查看全部 -
代码回顾
自定义作用域(自定义类部分)
查看全部 -
测试方法,如图
创建线程的方法为
new Thread(new Runnable() { @Override public void run() { Bean bean = context.getBean("bean",Bean.class); System.out.println("bean = " + bean); } }).start();
查看全部 -
使用SimpleThreadScope作用域
该作用域的作用是,在每一个线程里spring会提供一个全新的实例。在同一个线程多次向spring上下文申请实例的时候spring会提供同一个实例。但如果在多个线程里面每一个线程都向spring上下文申请一个实例,那么spring会给每一个线程申请一个新的实例。
先定义出SimpleThreadScope的实例
<bean class="org.springframework.context.support.SimpleThreadScope" id="SimpleThreadScope"/>
然后再在CustomScopeConfigurer的实例中加上
<entry key="simplethreadScope" value-ref="SimpleThreadScope"/>
查看全部 -
在spring.xml中,修改
<bean class="com.imooc.spring.ioc.class009.MyScope" id="myScope"/> <bean class="org.springframework.context.support.SimpleThreadScope" id="SimpleThreadScope"/> <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="myScope" value-ref="myScope"/> </map> </property> </bean> <bean id="bean" class="com.imooc.spring.ioc.class009.Bean" scope="myScope"/>
查看全部 -
自定义作用域
需要引用Scope接口,注意是
import org.springframework.beans.factory.config.Scope;
然后实现这个接口的方法。
重点关注get 和 remove方法,如图为实现双例模式(每一个Bean对应两个实例)。
public Object get(String s, ObjectFactory<?> objectFactory) { if(!map1.containsKey(s)){ Object o = objectFactory.getObject(); map1.put(s,o); return o; } if(!map2.containsKey(s)){ Object o = objectFactory.getObject(); map2.put(s,o); return o; } //若map1 和 map2都存在s,则随机返回一个 int i = new Random().nextInt(2);//0 or 1 if(i == 0){ return map1.get(s); }else { return map2.get(s); } } public Object remove(String s) { if(map2.containsKey(s)){ Object o=map2.get(s); map2.remove(s); return o; } if(map1.containsKey(s)){ Object o=map1.get(s); map1.remove(s); return o; } return null; }
查看全部 -
总结
reuqest:每个request请求都会创建一个单独的实例。
session:每个session都会创建一个单独的实例。
application:每个sercletContext都会创建一个单独的实例。
websocket:每个websocket链接都会创建一个单独的实例。
查看全部 -
该测试需要配置好Tomcat...
查看全部 -
之后在spring.xml中加上3个类的Bean
查看全部 -
创建ApplicationController、RequestController、SessionController类
修改RequestController类中代码,如图
其余两个类也做相同修改,只不同
@RequestMapping("testApplication")
@RequestMapping("testSession")
查看全部 -
在web.xml中配置spring的web上下文环境
查看全部
举报