java spring IOC Bean作用域

news/2024/7/24 6:31:58 标签: spring, java, 后端

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

那么 我们先代码演示 一下

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

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

java">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测试类 参考代码如下

java">
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对象 放到对应的区域中


http://www.niftyadmin.cn/n/1036644.html

相关文章

Failed to read candidate component class: file

问题会发生在 spring 使用注解的情况下发生 原因是 当前 使用的spring的版本 不被 你当前使用的JDK版本支持 这个 可以去找一下spring 与JDK的对应版本 然后再做处理

PAT甲级题库题解1001

准备三月份的PAT记录每天的题解 PAT甲级1001 #include<bits/stdc.h> using namespace std;int main(void) {freopen("pat0314/in.txt","r",stdin);int a,b;cin>>a>>b;int c a b;if(c < 0){printf("-");c -c;if(c < …

spring注解方式运行报错 java: 错误: 无效的源发行版:17

1 Project SDK 和 Project language level 要版本一直 2 Modules 查看版本 看JDK版本是否正确 3 Settings里面查看 java Compiler 里面的jdk版本是否一致 如果上述都没有问题 那么恭喜你 遇到了最麻烦的一种 spring与JDK 版本不匹配 以下是版本对照表 大家可以参考去重新…

PATA 题解 1002

PATA 1002题解 水题 没什么思路 #include<bits/stdc.h> using namespace std;const int MAXN 1010; double res[MAXN]; int main(void) { // freopen("pat0314/in.txt","r",stdin);int a,b;cin>>a;int maxExponent -1;for(int i 0;i<…

Uncaught (in promise) DOMException: Failed to execute ‘replaceState‘ on ‘History‘: A history state o

这是一个访问路径的错误 简单说 就是你访问的路径不符合 HTTP规范 好好检查一下 一般就是 多了斜杠 或者少了斜杠 多了某个符号 少了某个符号 好好检查一下就能解决的问题

PAT甲级题解1003

PAT甲级题库题解1003 For each test case, print in one line two numbers: the number of different shortest paths between c1 and c2​​ , and the maximum amount of rescue teams you can possibly gather. All the numbers in a line must be separated by exactly one…

PAT甲级题解1004

注意的是m代表的是the number of non-leaf nodes 要看清楚题意&#xff0c;一开始把n - m认为是输入的行数了… 利用vector特性 题意大致是寻找每层叶结点的个数&#xff0c;DFS遍历这棵树&#xff0c;遍历时统计即可。 #include<bits/stdc.h> using namespace std;cons…

uniapp uni-icons 组件为例 带着大家使用并熟悉一次文档

首先 要在应用市场中导入 这是个前提 https://ext.dcloud.net.cn/plugin?id28 uni的组件都可以直接进入官网 https://uniapp.dcloud.net.cn/ 然后点击右上角的搜索 直接在输入框中 搜索 uni-icons 下面内容就都出来了 先看下面的 API 看看每个字段都是干什么的 这里 我们…