【spring注解驱动开发】- 自动装配 - Aware自动注入容器底层组件和原理

本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git

上两篇文章我们学习了spring提供的@Autowired注解和java提供的@Resource,@Inject注解自动装配我们自定义的组件,但是如果我们在自定义组件的时候需要用到spring底层的组件,那该怎么办呢?这里spring给我们提供了Aware接口,下面我们就来学习一下

1 验证Aware接口

Aware接口的作用:如果我们自定义的组件实现了Aware相关的接口,那么在创建自定义组件的之后,会回调相应的Aware提供的一些方法获取我们想要的spring底层组件,比如ApplicationContext,BeanFactory等等
查看源码,发现Aware这个接口有很多子类
在这里插入图片描述
我们下面来验证一下这三个子类的实现效果
首先我们自定义一个Red组件实现这三个接口提供的方法

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-05 15:18
 */
public class Red implements ApplicationContextAware, EmbeddedValueResolverAware, BeanNameAware {

    public Red() {
        System.out.println("Red 组件创建.....");
    }

    //实现ApplicationContextAware接口回调的方法,会在创建Red组件之后调用这个方法
    // 将ApplicationContext组件传给Red组件
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("容器组件:"+ applicationContext);
    }

    /**
     * 实现EmbeddedValueResolverAware接口回调的方法,会在创建Red组件之后调用这个方法
     * 将StringValueResolver组件传给Red组件
     * StringValueResolver这类的作用:
     * 可以解析SPEL表达式,也可以解析${}从运行环境中获取值
     */
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        String str = resolver.resolveStringValue("我是 ${os.name},今年 #{20-2} 岁");
        System.out.println(str);
    }

    //实现BeanNameAware接口回调的方法,会在创建Red组件之后调用这个方法
    //将Red组件在容器中的名字传过来
    public void setBeanName(String name) {
        System.out.println("Red组件在容器中的名字为:" + name);
    }
}

将组件注册到容器中,然后写个测试用例

 //测试Aware
@Test
public void test02(){
     //创建容器
     ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
 }

运行结果
在这里插入图片描述

2 Aware的实现原理

通过看源码,其实每一个Aware的子类都有一个与之对应的xxxProcessor
在这里插入图片描述
下面我们就看一下ApplicationContextAwareProcessor的源码分析一下原理
在这里插入图片描述
在这里插入图片描述
通过看源码知道最后能实现自动装配的效果,其实依赖于BeanPostProcessor这接口,想了解这个接口的可以看看我前面的博客

发布了78 篇原创文章 · 获赞 32 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/suchahaerkang/article/details/104727351