由Spring管理的对象的生命周期

注:完整代码在文章最后

生命周期:某个对象从创建到最终销毁会经历的历程!

通常,需要讨论生命周期时,对应的数据类型的对象都不是由开发人员自行维护的!

被容器维护的对象,都是由容器创建对象,并在适当的时候调用其中的某些方法的!而开发人员需要做的就是“确定满足某条件的时候应该执行什么任务”!也就是说,“容器决定什么时候执行,开发人员决定执行时做什么”。

学习生命周期的意义就是“知道在什么时候需要做什么事情”!

Servlet为例,其生命周期中会有几个特殊的方法,在特定的情况下会被调用,这些就称之为生命周期方法:

  • init():当Servlet被创建对象后,立即执行,且只执行1次,该方法适合编写一些初始化相关的代码;
  • service():当接收到匹配的请求后会被调用,接收到多少次请求,就执行多少次该方法;
  • destroy():当Servlet对象即将被销毁之前执行,且只执行1次,该方法适合编写一些与结束相关的代码,例如关闭等等。

当使用Spring框架后,某些类的对象交给Spring框架来管理了,那么,这些对象在什么时候被创建、什么时候被销毁,及创建过程和销毁过程中需要执行某些代码,对于开发人员来说,一定程度上是不可控的!

Spring框架允许用户在类中自定义最多2个方法,分别表示“初始化方法”和“销毁方法”,并且,Spring框架会在创建对象之后自动调用初始化方法,会在销毁对象之前调用销毁方法!关于方法的定义:

  • 访问权限:应该使用public权限;
  • 返回值类型:使用void
  • 方法名称:自定义;
  • 参数列表:空。

例如,在User类中自定义2个生命周期方法:

public void init() {
    System.out.println("User.init()");
}

public void destroy() {
    System.out.println("User.destroy()");
}

然后,在配置对象的方法之前的@Bean注解中配置这2个方法作为生命周期方法:

@Bean(initMethod="init", destroyMethod="destroy")
public User user() {
    return new User();
}

全部代码:
User类

public class User {
	public User() {
		System.out.println("User.User()");
	}
	public void init() {
		System.out.println("User.init()");
	}
	public void destroy() {
		System.out.println("User.destroy()");
	}
}

Beans类:

public class Beans {
	@Bean(initMethod = "init",destroyMethod = "destroy")
	//@Scope ("prototype")
	public User user() {
		return new User();
	}
}

//Demo主类:

public class Demo {
	public static void main(String[] args) {
		//获取容器
		AnnotationConfigApplicationContext ac 
			= new AnnotationConfigApplicationContext(Beans.class);
		//获取对象
		User user1 = ac.getBean("user",User.class);
		User user2 = ac.getBean("user",User.class);
		User user3 = ac.getBean("user",User.class);
		//测试
		System.out.println(user1);
		System.out.println(user2);
		System.out.println(user3);
		//关闭资源
		ac.close();
	}
}

热门文章

暂无图片
编程学习 ·

创新实训(10)-提取式文本摘要之bert聚类

创新实训(10)-提取式文本摘要之bert聚类 1. 思路 使用bert作为预训练模型,利用bert生成的词向量进行下游任务的处理,在这篇论文中使用的是k-means计算词向量分布的重心作为文本摘要的候选句子。可以看作是聚类的一种形式。 2.代码分析 基于Pytorch的Transformers框架,使用预…
暂无图片
编程学习 ·

latex在线编辑公式(可快速查看latex码)

在发表论文时,常常会用到latex进行排版,但是会遇到mathtype转换为latex的问题,这里提供了一个latex在线编辑公式的网址,效果如下: http://latex.codecogs.com/eqneditor/editor.php
暂无图片
编程学习 ·

Docker在阿里云上(Centos)下载安装

Docker作用 简单来说就是可以不在考虑项目的运行环境直接转移部署项目,只需要一个镜像文件,甚至可以理解为一个虚拟机(windows的VM软件里安装linux系统)。 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker…
暂无图片
编程学习 ·

设计模式-工厂模式

关注公众号 JavaStorm 获取更多精彩工厂模式定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化…
暂无图片
编程学习 ·

从mixin机制理解Flutter App启动

文章目录1-mixin机制1.1-前言1.2-mixin特性2-runApp启动2.1-binding初始化2.2-绑定根节点2.3-绘制热身帧总结 1-mixin机制 1.1-前言转载注明出处:https://juejin.im/post/5efbf499e51d4534b979050c  mixin机制并非dart独创,在其他前端语言中也有很广泛应用。但对于一个刚开…
暂无图片
编程学习 ·

XML DOM摘要四(XMLHttpRequest 对象)

什么是 XMLHttpRequest 对象?XMLHttpRequest 对象提供了在网页加载后与服务器进行通信的方法。XMLHttpRequest 对象是开发者的梦想,因为您能够:在不重新加载页面的情况下更新网页在页面已加载后从服务器请求数据在页面已加载后从服务器接收数据在后台向服务器发送数据 所有现…
暂无图片
编程学习 ·

JDK的安装与配置

搭建java开发环境 java语言执行需要经过编译原代码,之后才可以在JVM上解释字节码车光绪,这些需要JDK的支持才能完成 开发者可以直接通过Oracle官方网站获取JDK工具。选择与自己操作系统对应版本,初学者版本不必过新。 下载完之后获得一个程序安装包,双击运行即可。 例如将J…
暂无图片
编程学习 ·

zabbix(三)对服务的监控

文章目录zabbix(三)对服务的监控httpd/nginxmysql zabbix(三)对服务的监控 httpd/nginx 1>给 server2 添加 httpd 监控 但是这个 http 监控的监控项只有一个,下面在 server3 上自定义 nginx 的监控#源码编译 nginx,关闭 debug,添加监控模块 [root@server3 nginx-1.15.8]#./c…
暂无图片
编程学习 ·

记录一下开始搭建springboot+jsp项目遇到的一个问题

记录一下开始搭建springboot+jsp项目遇到的一个问题简述自己搭建项目的过程错误及解决总结加补充 最近刚开始学习搭建springboot项目,用到的ide工具是idea,前端用的是jsp 简述自己搭建项目的过程 直接上图在idea中创建一个springboot项目,选择好自己使用的jdk 刚创建好的项目…
暂无图片
编程学习 ·

sed详解

1. Sed简介sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有…
暂无图片
编程学习 ·

跟汤老师学Java笔记:文件字节输入输出流

跟汤老师学Java笔记:文件字节输入输出流 完成:第一遍 1.文件字节输入流创建和常用方法有哪些? 创建:构造参数有字符串和File对象两种 方法: 方法:fis.read() 作用:读取一个字节,返回int类型的字节值,如果读取到末尾返回-1 方法:fis.close() 作用:输入流用了操作系统…
暂无图片
编程学习 ·

STM32HAL库的串口通讯流程详解

一 查询模式 待定,日后补充 二 中断模式 1 中断接收 1.1中断接收流程 先在启动文件中找到中断向量表(此处以USART1为例子)然后找到USART1_IRQHandler的函数定义在这里就会发现又跳转到了 HAL_UART_IRQHandler(&huart1);,追进去为下图所示:在图中标记的前三步是读取寄存…
暂无图片
编程学习 ·

【Docker】 Docker pull的时候指定仓库

1.概述 默认情况下docker pull会从docker hub拉取镜像文件,也可以手动指定一个仓库地址拉取镜像。假如你设置了一个本地仓库地址,那么你只要指定这个地址拉取镜像即可。仓库地址类似一个URL,但是没有协议头http://。 例如从一个镜像地址:myregistry.local:5000,拉取镜像文…
暂无图片
编程学习 ·

手把手撸一个轮播图

轮播图HTML和CSSJS HTML和CSS <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>轮播图</titl…
暂无图片
编程学习 ·

美团点评旅游搜索召回策略的演进

本文内容与6月22日第22期美团点评技术沙龙“美团点评AI实践”主题演讲一致,欢迎大家去现场和作者交流。关注“美团点评技术团队”微信公众号,第一时间获取沙龙最新信息,还可以查阅往期沙龙PPT/视频。美团点评作为最大的生活服务平台,有丰富的品类可供用户选择,因此搜索这个…
暂无图片
编程学习 ·

SDL环境搭建

一、SDL简单来说SDL就是封装了复杂的音视频底层操作,简化了音视频处理的难度。主要用于游戏开发和多媒体开发领域。而且SDL是C语言编写,可以跨平台使用。二、环境搭建SDL的环境搭建及其简单,直接在官网下载开发库就可以了;下载地址:http://www.libsdl.org/download-2.0.ph…
暂无图片
编程学习 ·

文件和目录命令之cd

cd命令帮助原文 ~]# help cd cd: cd [-L|[-P [-e]]] [dir]Change the shell working directory. 更改shell工作目录。Change the current directory to DIR. 将当前目录更改为DIR。 The default DIR is the value of the HOME shell variable. DIR的默认值是shell变量HOME的值…
暂无图片
编程学习 ·

阿里云CentOS8安装nginx+php-fpm

附加知识 CentOS8已经开始使用dnf作为系统包的安装工具了,yum虽然可以用,但是已经不推荐了 安装nginx 阿里CentOS8安装的是nginx 1.14.1,感觉上还是想升级一下,参考CentOS 8升级nginx至最新版本(yum方式) 安装php-fpm 阿里CentOS8安装的是php7.2,可以用dnf升级一下,参考H…
暂无图片
编程学习 ·

ConcurrentHashMap的key为什么不能为空

当ConcurrentHashMap的value为什么不能为空原因比较好理解,因为当get返回为null时,在并发环境下你无法判断是key存在对应的value为null,还是key根本不存在。 key不能为空是因为当使用put一个(null, “aa”)时,null的hashCode为0,此时要么将该值插入对应的链表中,要么对值…