Spring -- Bean的生命周期

news2024/11/26 17:39:54

BeanDefinition

Spring容器在进行实例化时,会将xml配置的<bean>的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean 

 BeanDefinition 中几个重要方法如下

 

  • beanClassName:bean 的类名
  • initMethodName:初始化方法名称
  • properryValues:bean 的属性值
  • scope:作用域
  • lazyInit:延迟初始化        

  

第一步 拥有 BeanDefinition 后,首先就是通过反射调用构造函数,实例化当前Bean对象

第二部 对一些 @Autowire 或 @Value 属性进行依赖注入

第三步 如果这个Bean实现了 Aware 接口,那就要重写接口里面的方法,比较常见的Aware接口有如下三个

第四步  Bean的后置处理器,用来增强Bean的功能,在Bean的初始化之前执行

第五步  初始化方法,其中的 InitializingBean 也是个接口,如果Bean实现了这个接口,那么也需要重写接口的方法

第六步  也是Bean的后置处理器,在Bean的初始化之后执行,比如AOP,AOP的底层就是动态代理

第六步结束后,我们就能从容器中获取Bean进行使用了,使用结束后,关闭容器,Bean就会销毁

 从上面可以看出,Bean的创建和初始化赋值是分开的

下面编写一个类,更直观来展示Bean的生命周期

先定义一个Bean

@Component
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {

    //构造函数
    public User() {
        System.out.println("User的构造方法执行了.........");
    }

    private String name ;

    //依赖注入
    @Value("张三")
    public void setName(String name) {
        System.out.println("setName方法执行了.........");
    }

    //BeanNameAware接口
    @Override
    public void setBeanName(String name) {
        System.out.println("setBeanName方法执行了.........");
    }

    //BeanFactoryAware接口
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory方法执行了.........");
    }

    //ApplicationContextAware接口
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("setApplicationContext方法执行了........");
    }

    //自定义init
    @PostConstruct
    public void init() {
        System.out.println("init方法执行了.................");
    }

    //InitializingBean接口
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet方法执行了........");
    }

    @PreDestroy
    public void destory() {
        System.out.println("destory方法执行了...............");
    }

}

 

额外定义一个类,用来实现 Bean 的后置处理

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("postProcessAfterInitialization->user对象初始化方法后开始增强....");
            //cglib代理对象
            Enhancer enhancer = new Enhancer();
            //设置需要增强的类
            enhancer.setSuperclass(bean.getClass());
            //执行回调方法,增强方法
            enhancer.setCallback(new InvocationHandler() {
                @Override
                public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                    //执行目标方法
                    return method.invoke(method,objects);
                }
            });
            //创建代理对象
            return enhancer.create();
        }
        return bean;
    }

}

最后,编写一个测试类并运行

public class UserTest {

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        User user = ctx.getBean(User.class);
        System.out.println(user);
    }

}

输出结果如下

 

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

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

相关文章

阿里云——云服务器基础运维与管理

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 学习目标&#xff1a; 一.3个理由拥抱云服务器 1.什么是云服务器 2.使用…

人物百科词条创建教程分享,人物创建百科有什么要求

人物百科词条的创建是一个相对复杂的过程&#xff0c;需要遵循一定的规范和要求。以下是一个人物百科词条创建教程的分享&#xff0c;包括创建要求、步骤和注意事项&#xff0c;接下来伯乐网络传媒就来给大家好好讲一讲。 一、人物百科词条创建要求 1. 真实性&#xff1a;创建…

ELK-日志服务【filebeat-安装使用】

目录 【1】安装Filebeat 【2】配置-测试 【3】配置使用Filebeat 【4】filebeat-收集系统文件日志 【5】配置filebeat&#xff0c;将/var/log/all.log日志采集到es集群中 【6】定制索引名称 【7】收集多个web节点的日志&#xff0c;输出到相同的索引中 【8】filebeat-收…

【并查集+组合计数】ABC226 E

E - Just one (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先有个条件&#xff1a;每个点只有一个出边 如果没有直接看出结论&#xff0c;可以画几个链和树等特殊的图&#xff0c;可以发现&#xff0c;树是不满足条件的&#xff0c;环是满足条件的&#xff0c;因此可…

管理类联考——数学——记忆篇——数字编码

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程 javaweb开发环境的配置也是比较繁琐的一件事情&#xff0c;虽然理论上使用记事本&#xff0c;完全可以写出一个Javaweb工程&#xff0c; 但是在团队大型开发的Javaweb过程中&#xff0c;你必须配置好Eclipse、SV…

【算法集训之线性表篇】Day 08

文章目录 题目基本设计思想思路一思路二 代码实现效果 题目 已知一个整数数列A{a0,a1,a2,…,an-1}&#xff0c;其中0<ai<n(0<i<n)。若存在ap1ap2ap3…apmx且m>n/2(0<pk<n,1<k<m)&#xff0c;则成x为A的主元素。例如A{0,5,5,3,5,7,5,5}&#xff0c;…

Python模拟MQTT v3.1.1服务器

示例代码 import logging import asyncio from hbmqtt.broker import Broker# 设置日志级别为DEBUG logging.basicConfig(levellogging.DEBUG)# 创建MQTT服务器 broker Broker()# 启动MQTT服务器 async def start_broker():await broker.start()# 停止MQTT服务器 async def s…

好用到哭!后悔没有早点看到这个微信多账号管理工具!

作为一款及时通讯软件&#xff0c;微信是许多企业进行客户运营的选择工具。企业的员工利用微信与客户进行沟通&#xff0c;并且许多客单也都在微信上如数完成。然而&#xff0c;微信本身并不具备运营需要的很多功能&#xff0c;所以需要借助第三方工具来实现。 安全吗&#xf…

day20 数组指针

int main(void) {char *name[5] {"hello","china","beijing","project","Competer"};int i;for(i0;i<5;i){printf("%s\n",name[i]);//结果打印五个字符串}return 0; }数组指针&#xff0c;存了5个指针&#x…

串行FLASH文件系统FatFs-实际应用

目录 串行FLASH文件系统FatFs-实际应用 功能展示 程序代码 程序过程分析 串行FLASH文件系统FatFs-实际应用 功能展示 实验主要使用我们移植好的FatFs的FLASH文件系统实现三个功能&#xff1a;设备信息获取、文件定位写入功能测试和文件信息获取测试功能。 最终串口输出结…

4.带你入门matlab排序最值标准差标差(matlab程序)

%% 学习目标&#xff1a;排序&#xff0c;最值&#xff0c;标准差&#xff0c;方差 代码及结果 %% 排序 clear all; X[1 3 4;8 3 5;2 7 4] y1sort(X) %按列由小到大排序 y2sort(X,2) %按行由小到大排序 y3sort(X,1,descend) %按列由大…

自定义程序包不存在的解决方法

方案一&#xff1a; 在pom文件中加入以下代码 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.4.2</version><configuration><skipTests>true</sk…

数据驱动的决策优化,半导体CMS系统在企业管理中的应用

在当今信息时代&#xff0c;数据的重要性在企业管理中愈发凸显。半导体制造业作为一个高度自动化和数据密集的行业&#xff0c;利用数据进行决策优化对于企业的成功至关重要。在这方面&#xff0c;PreMaint CMS系统扮演着关键的角色&#xff0c;为企业管理提供了数据驱动的决策…

Git Commit的规范及高级使用方法

git commit是日常工作中使用率极高的一个命令&#xff0c;但是根据我从业5年的经验来看&#xff0c;大多数人在用git commit命令时都很粗糙&#xff0c;比如git commit -m 后跟的message是五花八门&#xff0c;有用中文的&#xff0c;有用英文的&#xff0c;甚至还有直接跟111的…

小程序搭建教程

小程序搭建流程 随着移动互联网的发展&#xff0c;小程序成为了营销和服务的重要渠道之一。在本文中&#xff0c;我们将介绍如何搭建一个小程序的详细流程&#xff0c;包括公众号申请、支付微信认证费、复用资质申请小程序、开通微信支付、绑定第三方开发平台、添加商品服务内…

基于SpringBoot的企业人力资源管理系统设计与实现

1.引言 随着经济改革开放的发展&#xff0c;企业之间的竞争也越来越激烈&#xff0c;在这样的大环境下&#xff0c;企业要想立于不败之地&#xff0c;不仅要有好的商品&#xff0c;更要有一支强有力的团队&#xff0c;其本质就是人才。企业对人才的需求不断的增加&#xff0c;…

视频剪辑素材网站,免费可商用,赶紧马住~

推荐几个高质量视频素材网站&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#xff…

485远传水表抄表系统

485远传水表抄表系统是一种基于RS-485通信协议的远程抄表系统&#xff0c;它利用现代通信技术&#xff0c;实现了对水表数据的远程采集、传输和处理&#xff0c;是智慧城市建设的重要组成部分。本文将从以下几个方面对485远传水表抄表系统进行全面介绍&#xff1a; 一、系统组成…

【Spring Boot】Spring Boot的系统配置 — 系统配置文件

系统配置文件 Spring Boot的系统配置文件&#xff0c;包括application.properties和application.yml配置文件的使用以及YML和Properties配置文件有什么区别&#xff0c;最后介绍如何更改Spring Boot的启动图案。 1.application.properties Spring Boot支持两种不同格式的配置…