【备战春招】第18天 Spring入门

2023/2/27 6:21:01

本文主要是介绍【备战春招】第18天 Spring入门,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

课程名称:Spring入门

课程章节:第2章 Spring Bean作用域

课程讲师: 西昆仑

课程内容:

一、自定义作用域

1、自定义作用域

代码示例:

//MyScope.class

public class MyScope implements Scope {

Map<String, Object> map1 = new ConcurrentHashMap<String, Object>();

Map<String, Object> map2 = new ConcurrentHashMap<String, Object>();

//获取一个实例

public Object get(String name, ObjectFactory<?> objectFactory){

if(!map1.containsKey(name)){

Object o = objectFactory.getObject();

map1.put(name, o);

return o;

}

if(!map2.containsKey(name)){

Object o = objectFactory.getObject();

map2.put(name, o);

return o;

}

int i = new Random().nextInt(2);

if(i==0){

return map1.get(name);

}else{

return map2.get(name);

}

}

//移除一个实例

@Nullable

public Object remove(String name){

if(map2.containsKey(name)){

Object o = map2.get(name);

map2.remove(name);

return o;

}

if(map1.containsKey(name)){

Object o = map1.get(name);

map1.remove(name);

return o;

}

return null;

}

}

//spring.xml 

<bean class="com.imooc.spring.ioc.class09.MyScope" id="myScope"/>

<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"/> 

//Class009Test.class

public void test(){

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

for(int i=0;i<10;i++){

Bean bean = context.getBean("bean",Bean.class);

System.out.println("bean="+bean);

}

}

运行结果:

https://img3.sycdn.imooc.com/63f8d2050001e28b14500816.jpg

2、SimpleThreadScope

//spring.xml

<bean class="com.imooc.spring.ioc.class09.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"/>

<entry key="simpleThreadScope" value-ref="simpleThreadScope"/>

</map>

</property>

</bean>

<bean id="bean" class="com.imooc.spring.ioc.class009.Bean" scope="myScope"/> 

//Class009Test.class

public void test(){

ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

for(int i=0;i<10;i++){

Bean bean = context.getBean("bean",Bean.class);

System.out.println("bean="+bean);

}

for(int i=0;i<10;i++){

new Thread(new Runnable() {

public void Run(){

Bean bean = context.getBean("bean",Bean.class);

System.out.println("bean="+bean);

}

})

}

}

运行结果:

https://img2.sycdn.imooc.com/63f8d2190001c7b114500814.jpg

在Prototype作用域下,有多个Bean被创建,每次向Spring上下文请求该Bean都会new一个新的实例。

二、Bean的懒加载

https://img4.sycdn.imooc.com/63f8d2230001db6a14500820.jpg

懒加载概念(只对Singleton作用域的bean有效):

  • Spring容器会在创建容器时提前初始化Singleton作用域的bean。

  • 但是如果Bean被标注了lazy-init="true",则该Bean只有在其被需要的时候才会被初始化。

1)为某个Bean设定懒加载

<bean id="bean2" class="com...Bean" lazy-init="true"/>

2)为所有的Bean设定懒加载

<beans default-lazy-init="true">

……

</beans>

适用场景:如果某个Bean在程序整个运行周期都可能不会被使用,那么可考虑设定该Bean为懒加载

三、Bean初始化

1、Bean初始化

如果需要在Bean初始化之后执行一些逻辑,有两种方法:

  • 使用init-method

https://img2.sycdn.imooc.com/63f8d2ab0001c47714440812.jpg

  • 让Bean实现InitializingBean接口

https://img1.sycdn.imooc.com/63f8d2c100014f3814520816.jpg

2、Bean销毁

如果需要在Bean销毁之前执行一些逻辑,有两种方法:

  • 使用destroy-method

https://img2.sycdn.imooc.com/63f8d2b200016dce14480816.jpg

  • 让Bean实现DisposableBean接口

https://img4.sycdn.imooc.com/63f8d2e00001512614500818.jpg

3、使用init-method、destroy-method代码示例

<bean class="com.imocc.spring.ioc.classll.Bean" init-method="onInit" destroy-method="onDestroy" id="bean"/>

运行结果

https://img1.sycdn.imooc.com/63f8d2a50001d49b14500814.jpg

4、如果所有bean的初始化及销毁方法名称相同,则可在最外层添加

<beans default-init-method="onInit" default-destroy-method="onDestroy">

……

</beans>

https://img2.sycdn.imooc.com/63f8d2b90001e86d14500810.jpg

课程收获:有了前几节课程的基础,本节课程听着感觉非常细致,容易理解,期待后续的知识学习。




这篇关于【备战春招】第18天 Spring入门的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程