java spring IOC Bean作用域

spring 的bean中 是可以设置创建单实例 或 多实例
两句话
1 bean的作用域 就是bean创建单实例 或 创建多实例
2 在你不对bean作用域做任何处理时 他是默认创建单实例的

那么 我们先代码演示 一下

我们先创建一个java项目 然后引入spring 的基本依赖

然后在项目的src下创建 collectiontype目录 下面创建一个java类 我这里叫 Course
参考代码如下

package collectiontype;

//课程类
public class Course {
    //课程名称
    private String cname;
    public void setCname(String cname) {
        this.cname = cname;
    }
}

其实这个类里写什么并不重要

然后我们在 src目录下创建 bean.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">
    <bean id="course" class="collectiontype.Course"></bean>
</beans>

这里我们只是非常基本的创建了一个bean对象 对应Course类对象 没有做任何操作

我们前面说过 不做任何操作的bean创建出来的就是单实例

那么 我们用一个测试类来验证一下 在src下创建 text测试类 参考代码如下


import collectiontype.Course;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class text {
    public static void main(String args[]) {
        //获取配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Course course1 = context.getBean("course", Course.class);
        Course course2 = context.getBean("course", Course.class);
        System.out.println(course1);
        System.out.println(course2);
    }
}

这里 我们读取xml配置 然后 通过反射创建了Course配置中的对象 然后直接输出 但这次 我们同时创建了两个对象 然后 分别输出
因为 验证一个bean是不是单实例对象非常简单 你只要获取多次 然后输出 如果输出的地址相同 则代表是单实例对象

运行结果如下
在这里插入图片描述

那么 我们知道了 默认不做操作 bean创建的是单实例 那么怎么操作呢

我们bean标签里有一个 scope 属性 专门是用来设置单或多实例的
这个属性有多个值 但比较常用的有两个

第一个 singleton 这是个默认值 你不设置scope 那么 scope的值就是singleton代表设置为单实例
第二个 prototype 设置为多实例

那么 刚学到的 多实例 来玩一下吧
将src下的 bean.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">
    <bean id="course" class="collectiontype.Course" scope="prototype"></bean>
</beans>

简单说 就是 bean标签上加一个 scope=“prototype”

我们再次运行text测试类
在这里插入图片描述
这次可以看到 我们创建多个时 输出地址就不同了

singleton的话 你可以知道这个东西 但没必要使用 你想要单实例 不设置 他默认就是 singleton

而 单实例和多实例 最大的区别在于 单实例bean 在读取配置文件时就已经创建好了 而你去获取对象 始终拿到的都是读取xml时创建的那一个bean对象
而你设置多实例的bean时 配置文件被读取时 并不会创建对象 要在你获取对象 也就是调用getBean时 他才会创建对象

简单说 单实例 读取xml时会直接创建对应bean的对象 然后 getBean 是获取这个已经创建好的对象 获取多少次 都是一开始读取时创建的那个

而 多实例 则是 读取xml 他就是读取一下配置信息 你每次调用 getBean 他都会重新创建一个新的对象

可能多实例听着更高大上 但其实于性能而言 单实例更友好 所以它才是默认值

scope其实还有两个值 分别是
request
session
这是两个域对象 用的相对不是特别多 意思是 创建的bean对象 放到对应的区域中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值