认识BeanNameAware

转载地址:https://www.cnblogs.com/juncaoit/p/11227001.html

在看Spring的生命周期,就要注意到Spring Aware,Aware是什么,在这篇文章中,主要是说明三个部分,Spring的生命周期【这个在后面会继续说明,这里这是一个大纲】,然后说明Spring Aware,最后以BeanNameAware为示例进行说明。

一:生命周期

1.图

2.说明

  1. 在 Spring Bean Ready for Use之前的起源当然是要调用构造器,所以 Constructor 毋庸置疑是创建 Spring Bean 的第一步
  2. 通过 Setter 方法完成依赖注入,SDI (Setter Dependency Injection)
  3. 依赖注入一旦结束,BeanNameAware.setBeanName() 会被调用,它设置该 bean 在 Bean Factory 中的名称
  4. 接下来调用 BeanClassLoaderAware.setBeanClassLoader() ,为 bean 实例提供类加载器,我们知道所有类都是要通过类加载器加载到上下文的,关于类的加载机制/双亲委派模型(大厂都爱问的面试题)内容会在后续给出来,让你透彻的了解
  5. 然后 BeanFactoryAware.setBeanFactory() 会被调用为 bean 实例提供其所拥有的 factory

二:Aware说明

1.功能描述

Spring 的依赖注入最大亮点就是所有的 Bean 对 Spring 容器的存在是没有意识的,拿 [Spring Bean 生命周期之“我从哪里来”?]() 文章中“小学生入少先队”为例子说明,小学生还是那个小学生,加入少先队还是加入共青团只不过规则不一样罢了
  但是在实际项目中,我们不可避免的要用到 Spring 容器本身提供的资源(难免要有事情需要少先队组织的帮助),这时候要让 Bean 主动意识到 Spring 容器的存在,才能调用 Spring 所提供的资源,这就是 Spring Aware. 其实 Spring Aware 是 Spring 设计为框架内部使用的,若使用了,你的 Bean 将会和 Spring 框架耦合,所以自己不单独使用,但是在读框架源码时希望你不再模糊.

2.常用的Aware

Aware子接口描述
BeanNameAware获取容器中 Bean 的名称
BeanFactoryAware获取当前 BeanFactory ,这样可以调用容器的服务
ApplicationContextAware同上,在BeanFactory 和 ApplicationContext 的区别 中已明确说明
MessageSourceAware获取 Message Source 相关文本信息
ApplicationEventPublisherAware发布事件
ResourceLoaderAware获取资源加载器,这样获取外部资源文件

三:BeanNameAware

1.程序结构

2.自定义Aware,同时,注册bean

复制代码

 1 package com.jun.useTestPack.aware.beanName;
 2 
 3 import org.springframework.beans.factory.BeanNameAware;
 4 import org.springframework.stereotype.Component;
 5 
 6 /\*\*
 7  \* 自定义BeanNameAware
 8  \*/
 9 @Component(value = "testBeanName2")
10 public class MyBeanName implements BeanNameAware {
11     @Override
12     public void setBeanName(String name) {
13         System.out.println("MyBeanName-setBeanName:"+name);
14     }
15 }

复制代码

3.测试

启动spring boot进行测试。

复制代码

 1 package com.jun.useTestPack.aware.beanName;
 2 
 3 import com.jun.SpringBootApplicationTest;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 7 
 8 @SpringBootApplication
 9 public class ApplicationDemo {
10     public static void main(String\[\] args) {
11         SpringApplication.run(SpringBootApplicationTest.class,args);
12     }
13 }

复制代码

4.效果

4.结论

在生命周期中,会调用BeanNameAware接口的实现类中的setBeanName方法。

在这个方法中,说明可以拿到BeanName。

本文转自 https://www.cnblogs.com/like5635/articles/14161156.html,如有侵权,请联系删除。

BeanNameAware 是一个 Spring 框架中的接口,可以让一个 Bean 对象获取到自己在容器中的唯一标识(即 Bean 的名称)。在 Spring 容器中,每一个 Bean 都有一个唯一的标识符,这个标识符可以是在配置文件中定义的 Bean 名称,也可以是自动生成的。当一个 Bean 实现了 BeanNameAware 接口时,Spring 容器实例化该 Bean 后会自动将该 Bean 的名称传递给它,通过这种方式,Bean 对象就可以获取到自己在 Spring 容器中的名称,从而可以在运行时根据名称来获取其他 Bean 的引用。 BeanNameAware 接口只包含一个方法: ```java void setBeanName(String name) throws BeansException; ``` 当 Spring 容器实例化 Bean 后,会自动调用 setBeanName 方法并将该 Bean 的名称作为参数传递给它。实现该接口的 Bean 可以利用该方法获取到自己在 Spring 容器中的名称,并进行相关操作。通常情况下,我们可以在 setBeanName 方法中将 Bean 的名称存储到实例变量中,以便在需要时使用。例如: ```java public class MyBean implements BeanNameAware { private String beanName; @Override public void setBeanName(String name) { this.beanName = name; } public String getBeanName() { return this.beanName; } } ``` 在上面的例子中,MyBean 类实现了 BeanNameAware 接口,并在 setBeanName 方法中将 Bean 的名称存储到实例变量 beanName 中。通过 getBeanName 方法,我们可以在需要时获取该 Bean 在容器中的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值