ライフサイクルでの春の表情は、私たちはこの記事にあるものの認識認識春には、3つの部分、春のライフサイクルを指定することであることに注意してください概要[これは後述していきます、ここにあります]、次に、認識DESCRIPTIONばねは、最終的に一例として説明するBeanNameAware。
A:ライフサイクル
1.図。
0002
- 春の豆では
Ready for Use
、当然のことながら、コンストラクタを呼び出すことですので、コンストラクタは春の豆を作成するための最初のステップは間違いありません前に起源 - 完全に依存することによりセッター注入法、SDI(セッター依存性注入)
- 依存性の注入が完了すると、
BeanNameAware.setBeanName()
呼び出されます、それは豆の工場でBeanの名前を設定します - 次の呼び出し
BeanClassLoaderAware.setBeanClassLoader()
、Beanインスタンスのクラスローダは、我々はすべてのクラスは、コンテキストにロードされることを知って、クラスローダ/親委任モデルによるクラスのローディング機構は、(メーカーは面接の質問をするのが大好き)コンテンツが続きます出てくるし、あなたの完全な理解をしましょう - そして、
BeanFactoryAware.setBeanFactory()
その保有する工場Beanのインスタンスを提供するために呼び出されます
2: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。