Spring IOC容器与 Bean 管理 第3关:Bean 标签中的 scope 属性

28 篇文章 9 订阅

目录

任务描述

相关知识

Bean标签的常用属性

编程要求

测试说明

参考代码


任务描述

Bean标签中有许许多多的属性,不同的属性代表不同的含义,同一个属性又有不同的属性值。

本关任务:区分scope属性中单例和多例的区别。

相关知识

为了完成本关任务,你需要掌握:

  • Bean 标签的常用属性;

  • Bean 标签中scope属性的区别。

Bean标签的常用属性

  • id属性:用于指定配置对象的名称,不能包含特殊符号;

  • class属性:创建对象所在类的全路径;

  • name属性:功能同id属性一致,但是name属性值中可以包含特殊符号,若bean标签上没有id属性,那么name可以作为id使用。

  • scope属性:

    • singleton:默认值,单例,该模式下程序只有一个实例;

    • prototype:多例。每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new xxxBean():不会在容器启动时创建对象;

    • requestWeb开发中,创建了一个对象,将这个对象存入request范围,request.setAttribute()

    • sessionWeb开发中,创建了一个对象,将这个对象存入session范围,session.setAttribute()

    • globalSession:一般用于Porlet应用环境,指的是分布式开发;非Porlet环境,globalSession等同于session

实际开发中主要使用singletonprototype

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,要求如下:

  • 在配置文件applicationContext.xml中分别配置单例和多例的User类,User类全类名可通过右侧文件路径查看;

  • 完成Task类中getConfig()getSingle()getMultiton()三个方法:

    • getConfig()方法中实现获取Spring容器并返回,配置文件名为applicationContext.xml

    • getSingle()方法中通过ApplicationContext获取两个单例User类(改类可以右侧文件夹中进行查看),先后两个类都调用setName()方法,分别设置name属性值为张三丰张无忌

    • getMultiton()方法中通过ApplicationContext获取两个多例User类,先后两个类都调用setName()方法分别设置name属性值为张三丰张无忌

提示:通过容器使用getBean方法获取对象的返回值为Object类型,要使用对象中的属性或方法,需将其返回值强转为你所需对象类型。

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

预期输出:

  1. 单例User类输出结果:
  2. User{name='张无忌'}
  3. User{name='张无忌'}
  4. --------------------------
  5. 多例User类输出结果:
  6. User{name='张三丰'}
  7. User{name='张无忌'}

参考代码

applicationContext.xml

<?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.xsd">
    <!-- 配置单例User类 -->
    <bean id="user" class="com.educoder.step1.User" ></bean>
    <!-- 配置多例User类 -->
    <bean id="user2" class="com.educoder.step1.User" scope="prototype" ></bean>
</beans>

 Task.java

package com.educoder.step1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;
public class Task {
    public ApplicationContext getConfig(){
        /********** Begin **********/
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        return app;
        /********** End **********/
    }
    public List<User> getsingle(ApplicationContext app){
        List<User> list=new ArrayList<>();
        /********** Begin **********/
        User user = (User) app.getBean("user");
        User user2 = (User) app.getBean("user");
        user.setName("张三丰");
        user2.setName("张无忌");
        list.add(user);
        list.add(user2);
        /********** End **********/
        return list;
    }
    public List<User> getMultiton(ApplicationContext app){
        List<User> list=new ArrayList<>();
        /********** Begin **********/
        User user = (User) app.getBean("user2");
        User user2 = (User) app.getBean("user2");
        user.setName("张三丰");
        user2.setName("张无忌");
        list.add(user);
        list.add(user2);
        /********** End **********/
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于建章

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值