自定义Bean中如何注入Spring底层的组件

603 阅读1分钟

自定义Bean中要想使用Spring容器底层的一些组件(比如:ApplicationContext、BeanFactory等),此时,只需要让自定义组件实现XxxAware接口即可。此时,Spring在创建对象的时候,会调用XxxAware接口定义的方法,注入相关的组件。

配置bean:

/**
 * description:
 * author:dingyawu
 * date:created in 10:25 2020/12/7
 * history:
 */
public class Color implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
    private ApplicationContext applicationContext;

    private String beanName;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("传入的ioc:" + applicationContext);
        this.applicationContext = applicationContext;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("当前bean的名字:" + name);
        this.beanName = name;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        String resolveStringValue = resolver.resolveStringValue("你好${os.name} 年龄:#{20*2}");
        System.out.println("解析后的字符串为:" + resolveStringValue);
    }
}

配置类:

/**
 * description:
 * author:dingyawu
 * date:created in 23:37 2020/12/4
 * history:
 */
@Configuration
public class ColorConfig {
    @Bean
    public Color color(){
        return new Color();
    }
}

测试类:

/** 测试ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware接口的用法 */
@Test
public void testBlueAware() {
  // 创建IOC容器
  AnnotationConfigApplicationContext ac =
      new AnnotationConfigApplicationContext(ColorConfig.class);
  Color color = ac.getBean(Color.class);
  ac.close();
}

几点说明

1)EmbeddedValueResolverAware,通过EmbeddedValueResolverAware接口能够获取到StringValue解析器

2)XxxAware的底层原理是由XxxAwareProcessor类实现的, 例如,我们这里以ApplicationContextAware接口为例,ApplicationContextAware接口的底层原理就是由ApplicationContextAwareProcessor类实现的。从ApplicationContextAwareProcessor类的源码可以看出,其实现了BeanPostProcessor接口,本质上都是后置处理器。

class ApplicationContextAwareProcessor implements BeanPostProcessor