• Spring系列文章:Bean的作⽤域


    1、singleton

    默认情况下,Spring的IoC容器创建的Bean对象是单例的 

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans.xsd">
    6. <bean id="user" class="com.springcode.example.entity.User"/>
    7. beans>

    测试

    1. public class SpringTest {
    2. @Test
    3. public void testInsert(){
    4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    5. User user = applicationContext.getBean("user", User.class);
    6. System.out.println(user);
    7. User user1 = applicationContext.getBean("user", User.class);
    8. System.out.println(user1);
    9. }
    10. }

    结果

    通过测试得知可以看到Spring的IoC容器中,默认情况下,Bean对象是单例的。

    这个对象在什么时候创建的呢?可以为SpringBean提供⼀个⽆参数构造⽅法,测试⼀下,如下:

    1. public class User {
    2. public User(){
    3. System.out.println("无参构造执行");
    4. }
    5. }

    测试

    1. public class SpringTest {
    2. @Test
    3. public void testInsert(){
    4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    5. }
    6. }

     

    通过测试得知,默认情况下,Bean对象的创建是在初始化Spring上下⽂的时候就完成的

    2、prototype

    如果想让Spring的Bean对象以多例的形式存在,可以在bean标签中指定scope属性的值为: prototype,这样Spring会在每⼀次执⾏getBean()⽅法的时候创建Bean对象,调⽤⼏次则创建⼏次。

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans.xsd">
    6. <bean id="user" class="com.springcode.example.entity.User" scope="prototype"/>
    7. beans>

     测试

    我们可以把测试代码中的getBean()⽅法所在⾏代码注释掉:并且user增加无参构造方法

    可以看到这⼀次在初始化Spring上下⽂的时候,并没有创建Bean对象。

    scope如果没有配置,它的默认值是什么呢?默认值是singleton,单例的。

     3、其它scope

    scope属性的值不⽌两个,它⼀共包括8个选项:

    1. singleton:默认的,单例。
    2. prototype:原型。每调⽤⼀次getBean()⽅法则获取⼀个新的Bean对象。或每次注⼊的时候都是新 对象。
    3. request:⼀个请求对应⼀个Bean。仅限于在WEB应⽤中使⽤。
    4. session:⼀个会话对应⼀个Bean。仅限于在WEB应⽤中使⽤。
    5. global session:portlet应⽤中专⽤的。如果在Servlet的WEB应⽤中使⽤global session的话,和 session⼀个效果。(portlet和servlet都是规范。servlet运⾏在servlet容器中,例如Tomcat。 portlet运⾏在portlet容器中。)
    6. application:⼀个应⽤对应⼀个Bean。仅限于在WEB应⽤中使⽤。
    7. websocket:⼀个websocket⽣命周期对应⼀个Bean。仅限于在WEB应⽤中使⽤。
    8. ⾃定义scope:很少使⽤。

    4、⾃定义Scope

    接下来咱们⾃定义⼀个Scope,线程级别的Scope,在同⼀个线程中,获取的Bean都是同⼀个。跨线程 则是不同的对象:(以下内容作为了解)

    第⼀步:实现Scope接⼝

    spring内置了线程范围的类:org.springframework.context.support.SimpleThreadScope,可 以直接⽤

    第⼆步:将⾃定义的Scope注册到Spring容器中

    1. "org.springframework.beans.factory.config.CustomScopeConfigurer">
    2. "scopes">
    3. "myThread">
    4. "org.springframework.context.support.SimpleThreadScope"/>

    第三步:使⽤Scope

    "user" class="com.springcode.example.entity.User" scope="myThread"/>

    测试

    1. public class SpringTest {
    2. @Test
    3. public void testInsert(){
    4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    5. User user = applicationContext.getBean("user", User.class);
    6. User user1 = applicationContext.getBean("user", User.class);
    7. System.out.println(user);
    8. System.out.println(user1);
    9. // 启动线程
    10. new Thread(()->{
    11. User usera = applicationContext.getBean("user", User.class);
    12. User userb = applicationContext.getBean("user", User.class);
    13. System.out.println(usera);
    14. System.out.println(userb);
    15. }).start();
    16. }
    17. }

    结果

  • 相关阅读:
    半监督学习在恶意软件流量检测中的应用
    M1 在VMware里安装Centos8
    【Datawhale X 魔搭 】AI夏令营第四期AIGC方向,Task1:可图Kolors-LoRA风格AI图片生成入门(持续更新)
    C语言刷题系列——1.将三个整数按从大到小输出
    ruoyi-启动
    SpringCloud-Eureka服务注册与发现
    Guacamole 配置开启 Radius 身份认证方式
    华为机试真题 C++ 实现【We Are A Team】
    JavaScript面试刷题指南
    尚硅谷笔记——React组件的三大属性props、state、ref
  • 原文地址:https://blog.csdn.net/qq_34491508/article/details/132898963