首页 > 其他分享 >实现了Spring的Aware接口的自定义类什么时候执行的?

实现了Spring的Aware接口的自定义类什么时候执行的?

时间:2022-12-02 18:34:18浏览次数:61  
标签:setBeanFactory MyAware 自定义 beanFactory Spring BeanFactoryAware Aware bean



 在之前的内容中

​Spring的Aware接口有什么用?​

了解到用户可以通过实现相应的Aware接口来获取spring框架提供的能力,俗称“攀亲戚”

以如下代码为例,自定义类MyAware实现了BeanFactroryAware,希望在MyAware中攀上BeanFactory这个亲戚,那spring是什么时候给我beanFactory的呢?来探究一下

@Component
public class MyAware implements BeanFactoryAware {


BeanFactory beanFactory;

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

this.beanFactory = beanFactory;
}
}

实现了Spring的Aware接口的自定义类什么时候执行的?_spring

spring在实例化MyAware是遵循和其他bean相同的流程,也就是getBean→doGetBean→createBean→doCreateBean→initializeBean这一套

我们通过debug堆栈信息就能看出

实现了Spring的Aware接口的自定义类什么时候执行的?_spring_02

实现了Spring的Aware接口的自定义类什么时候执行的?_源码_03

镜头给到initializeBean,第一行代码

实现了Spring的Aware接口的自定义类什么时候执行的?_源码_04

实现了Spring的Aware接口的自定义类什么时候执行的?_源码_05

 在创建每一个bean时,都会执行一下这个invokeAwareMethods,这段代码的逻辑很简单,就是判断当前的bean是否是Aware类型的,如果是,具体是哪种

private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}

实现了Spring的Aware接口的自定义类什么时候执行的?_spring_06

很明显,我们这里是最后一种,BeanFactoryAware

然后它就会执行到

((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);

实现了Spring的Aware接口的自定义类什么时候执行的?_源码_07

也就是我们MyAware类本身的setBeanFactory,完成“攀亲戚”的过程

实现了Spring的Aware接口的自定义类什么时候执行的?_源码_08

实现了Spring的Aware接口的自定义类什么时候执行的?_spring_09



标签:setBeanFactory,MyAware,自定义,beanFactory,Spring,BeanFactoryAware,Aware,bean
From: https://blog.51cto.com/u_15696939/5907391

相关文章

  • 【JAVA】基于SpringSecurity登录的详细教程
    不知道抽起哪根筋,花了一周的时间终于写了个基于springsecurity的登录的样例,4、5年前在学springboot时曾经按书上的例子却怎么也写不出来,算是了却自己的一桩心愿吧。当然,我不......
  • Spring学习
    Spring学习1.Spring1.1简介Spring:春天—>给软件行业带来了春天2002年,RodJahnson首次推出了Spring框架雏形interface21框架。2004年3月24日,Spring框架以i......
  • SpringBoot
    自动装配原理从Spring的IOC到SpringBoot的自动装配原理DeferedImportSelector对Bean加载顺序的影响(当然是由@Import导入的)  DeferedImportSelector有一个分组的概念......
  • spring mvc环境之监听器、过滤器、拦截器(六)
    1.监听器Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。......
  • IDEA自定义注释模板-版本2
    配置注释模板:1.类:Templatetext:/***@description:TODO*@authorliuyachao*@date$DATE$$TIME$*/Editvariables:2.方法:Templatetext:*$params$*......
  • 【FastDfs】Docker自定义构建ARM架构的FastDfs镜像
    由于服务器环境为ARM架构,在部署fastdfs时,发现网上的镜像几乎都是X86_64的,不同架构的镜像还不能通用,这个就有点烦了。。。。。由于之前没有从头编译制作过镜像,步步都是坑,在......
  • SpringBoot Maven多模块项目 mapper.xml 文件扫描不到问题
    项目使用的是SpringBoot+MybatisPlus,maven多模块项目,其中有多个模块的resource下面有Mapper.xml文件。这点是问题的前提。。。。。在配置文件里面也指定了mybatis-plus......
  • Springboot 获取 resource 下的文件夹路径的坑
    现在有个需求是需要利用模板文件生成HTML或者PDF文件,然后由于HTML模板文件里面包含图片和字体,然后我就在resource文件夹下新建了一个文件夹,然后又分类,也就是resource......
  • SpringCloud-Feign接口调用超时:feign.RetryableException: Connection timed out (Co
    刚开始代码里面使用的是:@FeignClient("leak")publicinterfaceLeakFeignServiceFeign{在本地跑是正常的,上了测试环境,两个服务独立部署后,出现如下异常:feign.Retryabl......
  • 【SpringCloud】Eureka Server实现高可用(IDEA同时启动两个Eureka Server)
    当你翻到这篇博客,可能你已经搭建好了一个EurekaServer的实例,这里记录一下参考网上的资料搭建实例的时候遇到的坑,视频里这点好像少了,使用IDEA启动两个EurekaServer。如果还......