Bean对象的作用域和生命周期

news2024/10/6 6:51:47

文章目录:一.Bean的作用域   (1)Bean作用域的含义

                                                (2)Bean的6种作用域

                   二.Bean的生命周期(1)开辟内存空间

                                                    (2) 属性注入

                                                      (3)初始化

                                                         (4)使用Bean

                                                       (5)销毁Bean对象

一.作用域

作用域含义:

Bean的作用域是指Bean在Spring整个框架中的某种行为模式

下面我们通过具体的代码来演示:

我们先来创建一个User类

@Component
public class User3 {
    public String name;
    public int age;

}

然后通过在方法上添加Bean注解的方式在Spring容器里添加一个user对象 

@Component
public class Signal {   
    @Bean(value = "user1")
   public User3 getuser1()
   {
       User3 user=new User3();
       user.name="小众";
       user.age=7;
       return user;
   }
}

然后在创建两个类,然后把user对象注入到这个类里面,并且在第一个类里面我们把user的name改动

@Component
public class Useuser1 {
    @Resource(name="user1")
    public User3 user;
    public void say()
    {
        System.out.println(user.name);
        user.name="小莲";
        System.out.println(user.name);

    }
}
@Component
public class Useuser2 {
    @Resource(name="user1")
    public User3 user;
    public void say()
    {
        System.out.println(user.name);
    }
}

 我们分别再启动类里面去运行,看一下打印结果

public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-conflig.xml");
        Useuser1 user=context.getBean("useuser1",Useuser1.class);
        user.say();
        Useuser2 user2=context.getBean("useuser2",Useuser2.class);
        user2.say();
    }

我们发现我们只是在Useuser1里面把user对象的名字给改了,但是Useuser2这个类里面的user对象的名字也发生了变化,这时因为默认情况下是单例模式,也就是同一个user对象只初始化一次,这个对象只有一份,是全局共享的,这两个类里面注入的对象是一份。

那可不可以两个类里面注入的对象存在多份,相互不影响呢?其实我们只需要通过添加Scope注解的方式,将模式改为多例作用域即可,  prototype即为多例作用域

@Component
public class Signal {
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean(value = "user1")
   public User3 getuser1()
   {
       User3 user=new User3();
       user.name="小众";
       user.age=7;
       return user;
   }
}

 这时我们再来观察结果:

 这时我们发现两个类里面注入的相同对象就不会互相影响了,

多例作用域:当我们多次注入同一个对象的时候,我们拿到的其实是最初的对象的拷贝,不同类里面注入的对象是多份,所以互不影响。

Bean的6种作用域:

1.sigleton:单例作用域    只存在一个实例,Spring默认选择改作用域

2.prototype  多例作用域:      存在多个实例,每次Bean请求都会创建新的实例,

3.request      请求作用域:每次htttp请求都会创建新的Bean实例,类似于prototype,限定于SpringMVC中使用

4.session   会话作用域: 在一个http session中,定义一个Bean实例,限定在SpringMVC中使用

5.application 全局作用域 在一个http servlet Context中,定义一个Bean实例,限定在SpringMVC中使用

6.websocket :    在一个http WebSocket的生命周期中,定义一个Bean实例,限定在Spring WebSocket中使用

单例作用域与全局作用域区别:

singleton是  Spring Core的作用域; application 是spring  web 中的容器

singleton 作用 于IOC容器,而application作用于 Servelt容器

二.Bean的生命周期

1.先为Bean分配内存空间,Bean对象的实例化

2.设置属性(注入属性)

3.初始化

     (1)实现了各种Aware通知的方法,比如BeanNameAware、BeanFactoryAware 

        (2)初始化前置方法

          (3)初始化方法(两种方式,xml方式和注解方式(PostConstruct))

            (4)  执行自己指定的init-method方法

            (5)初始化后置方法

4.使用Bean

5.销毁Bean对象

我们具体通过代码的形式来演示Bean的生命周期这一流程

在xml文件里注册beanlife对象,并且设置了一个自定义方法init

 <bean id="beanlife" class="kale.pole.Beanlife" init-method="init" > </bean>

@Component
public class Beanlife implements BeanNameAware {
        自定义的方法
    public void init() {
        System.out.println("执行 xml初始化方法");
    }
                    //表示具体使用Bean
    public void say() {
        System.out.println("执行say方法");
    }

    @PostConstruct  //构造方法
    public void myinit() {
        System.out.println("执行了注解初始化方法");
    }

    @PreDestroy     //摧毁bean
    public void preDestroy() {
        System.out.println("执行 preDestory方法");
    }

    @Override      //BeanName的通知
    public void setBeanName(String s) {
        System.out.println("执行了setBeanName方法:" + s);

    }
}

我们启动一下这个程序,注意 这里不要再用ApplicationContext这个类了,因为这个类里面没有pre

Destory这个方法,我们用它的子类

  public static void main(String[] args) {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-conflig.xml");
        Beanlife bean=context.getBean("beanlife",Beanlife.class);
        bean.say();
        bean.preDestroy();
    }

 

这里再强调一个问题:为什么属性注入要在初始化之前?这是因为如果一个类里面有依赖的对象的时候,我们在执行这个类的时候,需要先把这个对象给赋值。

例如如下代码:

@Component
public class UsePolice3 {
    public  Police police;
    @Autowired
    public UsePolice3(Police police)
    {
        this.police=police;
    }
    public void getpolice()
    {
        police.say();
    }

}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSDN|每日一练】运输石油

目录 运行结果题目描述输入描述:输出描述:示例代码结语运行结果 题目描述 某石油公司需要向A、B两地运输石油。 两地的需求量不同,而一辆车只能装载一定量的石油。 经过计算A地需要a辆车,B地需要b辆车运输才能满足需求。 现在一共有n辆车分布在各地,每辆车前往A、B两地…

HFSS一些使用技巧总结

1. 快捷键&#xff1a; CTRLH&#xff0c;隐藏选择的object、face 字母E&#xff0c;选择edge&#xff08;线&#xff09; alt左键双击九个区域&#xff0c;切换9个不同的视角&#xff08;与789组合使用) 2. 复制&#xff1a; 这样的复制好处在于&#xff1a;复制完的物体相…

使用Excel打造一款个人日志系统

写在前面 我很多年前看过晨间日志的奇迹这一本书&#xff0c;我深受启发&#xff0c;这本书的中心思想就是通过九宫格的方式写连体日志&#xff0c;自己可以方便查找而有而且有激情去完成这个日志&#xff0c;书中推荐的方法是使用excel写日志。但是自己总感觉用excel过于麻烦…

Java 源码中的 <? extends U>与 <? super L>是什么?

目录 ? extends U ? super L 总结一下: ? extends U 其中extends意思为&#xff1a;扩大;扩展;延长&#xff0c;&#xff1f;我们可以把他看作一个通配符&#xff0c;匹配所有的接口&#xff0c;U就一个泛型占位符&#xff0c;所以连在一起可联想到&#xff0c;从U…

前后端分离下的-SpringSecurity

前后端分离下的SpringSecurity 项目创建 使用SpringBoot初始化器创建SpringBoot项目 修改项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2…

电容笔和Apple pencil的区别是什么?好用电容笔推荐

Apple Pencil与目前市场上常见的电容笔最大的不同之处在于&#xff0c;普通电容笔并不具备苹果Pencil特有的重力压感&#xff0c;而仅仅是一种倾斜的压感。不过&#xff0c;其在其它方面的表现也很出色&#xff0c;与Apple Pencil相似&#xff0c;而且价格仅为200元。现在&…

项目管理中的冲突是什么?

项目管理中的冲突可以采取多种不同的形式。团队成员在创意愿景上存在分歧&#xff0c;与高层管理人员就期望和时间表发生争执&#xff0c;甚至与第三方供应商发生争执&#xff0c;都是项目冲突的主要例子。 冲突的常见原因是什么&#xff1f; 基于项目的组织内部冲突的典型原因…

【记录】Git连接gitee、新建仓库

学习记录1.连接gitee2.新建仓库1.连接gitee https://www.cnblogs.com/cokefentas/p/14727592.html git安装与卸载 apt-get install git apt-get remove gitgit配置 配置用户名 git config --global user.name "your name" 配置邮箱 git config --global user.email…

2023都说测试行业饱和了,为什么我们公司新招的的测试开了15K?

其实每年都有人说测试行业饱和了&#xff0c;但依旧有很多人找到了薪资不错的工作。来说说我的看法吧&#xff0c;我认为不用担心测试会饱和的问题&#xff0c;我们人口基数大&#xff0c;任何一个行业都有竞争&#xff0c;这是非常正常的情况。而且在有技术能力的人面前永远没…

Vue3通透教程【十一】初探TypeScript

文章目录&#x1f31f; 写在前面&#x1f31f; TypeScript是什么&#xff1f;&#x1f31f;TypeScript 增加了什么&#xff1f;&#x1f31f;TypeScript 初体验&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue …

什么是进程,线程,协程

一.进程1.简介计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序是运行于操作系统之上…

十分钟验证一个轻量化车联网解决方案

智能网联汽车在车联网的应用上&#xff0c;通常是以智能传感器、物联网、GIS技术为基础&#xff0c;结合大数据、人工智能技术&#xff0c;通过OT&#xff08;Operation tecnology&#xff09;和IT&#xff08;information tecnology&#xff09;融合的方式&#xff0c;实现智能…

使用Ubuntu22.04搭建k8s环境和一些k8s基础知识

minikube搭建 基本环境 我使用virtualBox构建的ubuntu&#xff0c;选择4核4G内存minikube是一个K8S集群模拟器&#xff0c;可以快速构建一个单节点的集群&#xff0c;用于在本地测试和开发首先使用官方脚本安装docker curl -fsSL https://test.docker.com -o test-docker.sh…

nacos源码服务注册

nacos服务注册序言1.源码环境搭建1.1idea运行源码1.2 登录nacos2.服务注册分析2.1 客户端2.1.1容器启动监听2.1.2注册前初始化2.1.3注册服务2.2 服务端2.2.1注册2.2.2重试机制3.注意事项序言 本文章是分析的是nacos版本2.2 这次版本是一次重大升级优化&#xff0c;由原来&#…

【MySQL | 基础篇】02、MySQL 函数详解

目录 一、字符串函数 1.1 concat : 字符串拼接 1.2 lower : 全部转小写 1.3 upper : 全部转大写 1.4 lpad : 左填充 1.5 rpad : 右填充 1.6 trim : 去除空格 1.7 substring : 截取子字符串 1.8 案例 二、数值函数 2.1 ceil&#xff1a;向上取整 2.2 floor&#xff…

【Java版oj】day34收件人列表、养兔子

目录 一、收件人列表 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、养兔子 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、收件人列表 …

Python机器学习:支持向量机2

昨天是简单的了解了一下支持向量机要干什么以及线性可分支持向量机是怎么一回事&#xff0c;今年来看另一种&#xff1a;线性支持向量机&#xff1a; 我们昨天说的&#xff0c;线性可分支持向量机的目的就是找到一个超平面来吧一个数据集分成正负两个部分&#xff0c;但是实际…

一天学完C++的标准模板库STL

标准模板库STLstring字符串如何对string字符串的初始化&#xff08;声明&#xff09;&#xff1f;如何遍历string对象进行访问&#xff1f;如何对string类型的字符串进行增删改查&#xff1f;对string字符串增加一些字符对string字符串删除一些字符对string字符串改动一些字符在…

【hello Linux】环境变量

目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux&#x1f337; 在开始今天的内容之前&#xff0c;先来看一幅图片吧&#xff01; 不知道你们是否和我一…

数据结构的加强甜点-序列1

目录 尾递归 问题 介绍 特点 原理 答案 数组栈堆内存分配 前言 分析 再分析 所谓多维数组 程序局部性原理应用 尾递归 问题 在空间复杂度这块&#xff0c;有个O(n)示例如下&#xff1a; void recur(int n) {if (n 1) return;return recur(n - 1); } 这很明显是…