Spring -- Bean的生命周期

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接口@Overridepublic void setBeanName(String name) {System.out.println("setBeanName方法执行了.........");}//BeanFactoryAware接口@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("setBeanFactory方法执行了.........");}//ApplicationContextAware接口@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("setApplicationContext方法执行了........");}//自定义init@PostConstructpublic void init() {System.out.println("init方法执行了.................");}//InitializingBean接口@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet方法执行了........");}@PreDestroypublic void destory() {System.out.println("destory方法执行了...............");}}

 

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

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals("user")) {System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....");}return bean;}@Overridepublic 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() {@Overridepublic 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.hqwc.cn/news/19026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud笔记二

配置管理服务是共有的&#xff0c;结合微服务自身的配置。这样核心配置更改就无需逐个更改 配置管理: 首先新建一个配置管理 Data ID为配置文件的名称 一般为项目名称-项目环境yaml&#xff0c;如userservice-dev.yaml 编写配置内容&#xff0c;发布 获取nacos配置信息: 可能…

【UnityDOTS 小知识】如何通过DOTS修改材质属性以及替换材质与网格

如何通过DOTS修改材质属性以及替换材质与网格 一、DOTS修改材质属性 1.利用 Material Overide Asset Material Overide Asset是一个Unity资产&#xff0c;可以通过Create创建。 创建后指定要修改的材质&#xff0c;以及对应材质的属性&#xff0c;即可完成这个资源创建。 然…

Kubernetes 入门篇上

❖ Kubernetes核心概念 ❖ 快速部署一个Kubernetes集群 ❖ Kubernetes将弃用Docker&#xff01; ❖ kubectl管理工具 ❖ Kubernetes基本资源概念 ❖ 资源编排&#xff08;YAML&#xff09; ❖ 深入理解Pod对象&#xff1a;基本管理 ❖ 深入理解Pod对象&#xff1a;调度 …

如何操作MySQL数据库基本数据

目录 一、MySQL数据库概念 数据 表&#xff08;数据表&#xff09; 数据库 数据库管理系统 数据库的建立和维护功能 数据定义功能 数据操纵功能 数据库的运行管理功能 通信功能 数据流向 二、主流数据库分类 1.SQL Server 数据库 &#xff08;微软分公司产品&…

QT分屏按钮

效果&#xff1a;按钮弹出分屏选择 // gridpopwidget.h #ifndef GRIDPOPWIDGET_H #define GRIDPOPWIDGET_H#include <QWidget> #include <QMouseEvent>class GridPopWidget : public QWidget {Q_OBJECT public:explicit GridPopWidget(QWidget *parent nullptr);~…

杨氏模量——从宏观(应力-应变曲线)到微观(原子键)尺度解释杨氏模量

杨氏模量&#xff08;Young’s Modulus&#xff09;是三个主要弹性常数之一&#xff0c;与剪切模量&#xff08;shear modulus&#xff09;、体积模量&#xff08;bulk modulus&#xff09;一起用于描述材料在载荷下如何变形 以下展示了拉伸试验的应力应变曲线 如果施加的应力…

基于servlet的简单登录界面

前端登录发起请求 1.安装axios axios 是一个 HTTP 的网络请求库 安装 npm install axios &#xff08;脚手架中&#xff09; 在 main.js 中配置 axios //导入网络请求库 import axios from axios; //设置访问后台服务器地址&#xff1a;ip&#xff0c;端口和项目名字&#xff0…

hbuilderX自定义主题仿vscode暗黑主题

目录 hbuilderX自定义主题仿vscode暗黑主题 效果图 设置方式&#xff08;把主题代码复制进来即可&#xff09; 是基于雅蓝主题自定义的 设置好后需要切换到雅蓝主题 hbuilderx保存时自动整理代码 1.首先在顶部栏&#xff0c;找到工具&#xff0c;打开设置 2.点击旁边的编…

盖子的c++小课堂——第十八讲:栈

目录 前言 栈的定义 栈&#xff0c;是什么&#xff1f; 例1-弹夹 问题 例2-停车场 问题 栈的概念 空栈 进栈、出栈 特点 例题 车厢调度 如何操作 数组模拟栈 入栈 出栈 栈的基本操作 判断空栈 求栈的元素数量 读栈顶元素 总结 前言 OK呀&#xff0c;说到做…

【unity细节】为什么有时候修改了脚本中的数据但是面板中的数据还是不改变

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐为什么有时候修改了脚本中的数据但是面板中的数据还是不改变⭐ 文章目录 ⭐为什…

微服务之Eureka服务注册中⼼

关于务注册中⼼服 服务注册中⼼本质上是为了解耦服务提供者和服务消费者,尽可能量使两者联系可控在一定的范围外 1.在父项目下下引入 Spring Cloud 依赖 <dependencyManagement> <dependencies> <!-- SCN --> <dependency> <groupId> org.sp…

分销商城系统有哪些模式,有什么功能和特点?

随着微信的广泛使用&#xff0c;微信在营销方面的发展呈现出多元化趋势&#xff0c;衍生出很多基于社交环境的营销模式。分销商城系统就是其中之一&#xff0c;很多企业都通过分销商城系统发展自己的分销商&#xff0c;充分挖掘微信社交体系的私域资源。下面我们一起来了解一下…