Spring源码解析之BeanPostProcessor知识总结
作者:随波逐流baby 发布时间:2022-04-07 22:13:34
标签:BeanPostProcessor,接口
一、简介
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。
实例化Bean做前置处理、后置处理
二、接口定义
@Component
public class BeanPost implements BeanPostProcessor {
/**
* 在每个bean创建之后的初始化方法之前调用
* @param bean 当前实例化的bean
* @param beanName bean的名称
* @return 返回实例化的bean或者可以对对象进行再封装返回
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化前"+beanName);
return bean;
}
/**
* 在每个bean的初始化方法执行之后被调用
* @param bean 当前实例化的bean
* @param beanName bean的名称
* @return 返回实例化的bean或者可以对对象进行再封装返回
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化后"+beanName);
return bean;
}
}
运行顺序
实例化bean对象->设置对象属性->检查Aware接口设置依赖
->BeanPostProcessor前置处理->检查是否是initializingBean以决定是否调用afterPropertiesSet方法->检查是否配置自定义init-method->BeanPostProcessor后置处理->注册必要的Destruction相关回调接口->。。。->是否实现DisposableBean接口->是否配置自定义destroy方法
三、源码
1.由AnnotationConfigApplicationContext进入
2.进入构造方法的refresh方法
3.进入到finishBeanFactoryInitialization方法
4.进入preInstantiateSingletons方法
5.执行getBean实例化方法
6创建bean实例
7.doCreateBean
8.进入初始化接口
9.可以看到执行到了BeanPostProcessor 提供的2个方法
进入内部可以看到
10.然后继续往下走开始AWare流程
内部:
11.进入invokeAwareInterfaces(bean);方法
内部:
当前bean实现了ApplicationContextAware接口
12.走到Person类中的setApplicationContext方法
一入源码深似海,苦海无边,回头是岸
来源:https://blog.csdn.net/qq_34351177/article/details/117659127
0
投稿
猜你喜欢
- 1 前言任何一门语言都需要基本的流程控制语句,其思想也符合人类判断问题或做事的逻辑过程。什么是流程控制呢?流程就是做一件事情的顺序,或者说是
- redis redisson 集合操作相关类及接口Rlist:链表public interface RList<V> exten
- 前言最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- 这篇文章主要介绍了JAVA如何按字节截取字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 前言有时候我们会在属性注入的时候添加@Lazy注解实现延迟注入,今天咱们通过阅读源码来分析下原因一、一个简单的小例子代码如下:@Servic
- JAVA中Integer类下的常用方法有哪些?1.进制转换 n进制转10进制 字符串结果Integer.parseInt(String s,
- 本文由Markdown语法编辑器编辑完成。1. 需求分析;已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回X
- java8的stream流能完美解对象集合去重问题. List<UserCar> list1 = new ArrayList()
- 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。2.
- 本文实例讲述了JAVA设计模式之备忘录模式。分享给大家供大家参考,具体如下:备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个
- 根据不同系统动态获取换行符和盘分割符1、获取盘分割符File.separator2、获取换行符windows系统为\r\n,Linux系统为
- LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多
- Spring概述Spring就是为解决企业应用开发的复杂性而创建的,做为开源中间件,它使用基本的JavaBean来完成以前只可能有EJB(J
- 一、说明Boost.MPI 提供了 MPI 标准(消息传递接口)的接口。该标准简化了并发执行任务的程序的开发。您可以使用线程或通过共享内存或
- 由于众所周知的原因,maven的库在中国大陆非常慢。我在百度上搜到的大部分文章都是直接在~/.m2/settings.xml 加入以下内容&
- 传统的Trie实现简单,但是占用的空间实在是难以接受,特别是当字符集不仅限于英文26个字符的时候, * 起来的空间根本无法接受。双数组Trie
- 业务现象代码中有一部分代码多次嵌套循环和数据处理,执行速度很慢解决方案通过多线程1、启用多线程private final static Ex
- 排查@CacheEvict注解失效我简单看了一下《Spring实战》中的demo,然后就应用到业务代码中了,本以为如此简单的事情,竟然在代码
- 前言大家在学习Java的过程中,或者工作中,始终都绕不开集合。在单线程环境下,ArrayList就可以满足要求。多线程时,我们可以使用Cop