006 认识BeanNameAware
2024-08-26 15:40:19
在看Spring的生命周期,就要注意到Spring Aware,Aware是什么,在这篇文章中,主要是说明三个部分,Spring的生命周期【这个在后面会继续说明,这里这是一个大纲】,然后说明Spring Aware,最后以BeanNameAware为示例进行说明。
一:生命周期
1.图
2.说明
- 在 Spring Bean
Ready for Use
之前的起源当然是要调用构造器,所以 Constructor 毋庸置疑是创建 Spring Bean 的第一步 - 通过 Setter 方法完成依赖注入,SDI (Setter Dependency Injection)
- 依赖注入一旦结束,
BeanNameAware.setBeanName()
会被调用,它设置该 bean 在 Bean Factory 中的名称 - 接下来调用
BeanClassLoaderAware.setBeanClassLoader()
,为 bean 实例提供类加载器,我们知道所有类都是要通过类加载器加载到上下文的,关于类的加载机制/双亲委派模型(大厂都爱问的面试题)内容会在后续给出来,让你透彻的了解 - 然后
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
package com.jun.useTestPack.aware.beanName; import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component; /**
* 自定义BeanNameAware
*/
@Component(value = "testBeanName2")
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("MyBeanName-setBeanName:"+name);
}
}
3.测试
启动spring boot进行测试。
package com.jun.useTestPack.aware.beanName; import com.jun.SpringBootApplicationTest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; @SpringBootApplication
public class ApplicationDemo {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplicationTest.class,args);
}
}
4.效果
4.结论
在生命周期中,会调用BeanNameAware接口的实现类中的setBeanName方法。
在这个方法中,说明可以拿到BeanName。
最新文章
- Spring MVC静态资源处理
- resin4 发布war包
- Make和Makefile编写(详见GCC手册)
- [svn]svn merge
- UI_RD协作开发流程
- JS函数的定义与调用方法
- eclipse如何设置成保护眼的背景色
- mysql最大连接数问题
- 《Effective Objective-C 2.0》 读后总结
- EntityFramework Core映射关系详解
- Selenium_WebDriver_元素方法
- PHP中域名绑定
- 轮询、长轮询、长连接、flash socket 的区别
- PHP信号管理
- python基础4--控制流
- php对函数的引用
- μC/OS-II 任务的同步与通信 --- 消息队列
- 读高性能JavaScript编程 第四章 Conditionals
- 不同.NET Framework版本下ASP.NET FormsAuthentication的兼容性
- java日期获取前一天和后一天