zoukankan      html  css  js  c++  java
  • 006 认识BeanNameAware

      在看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。

      

  • 相关阅读:
    NOIP前做题记录
    AtCoder Grand Contest 021题解
    AtCoder Grand Contest 020 题解
    CODE FESTIVAL 2017 Final题解
    Code Chef October Challenge 2019题解
    5.20 校内模拟
    5.19 湖南师大附中省选模拟1
    NOI2016 循环之美
    博弈复习
    5.18 省选模拟
  • 原文地址:https://www.cnblogs.com/juncaoit/p/11227001.html
Copyright © 2011-2022 走看看