spring拓展点之- Aware 接口
一:Aware接口的作用
aware接口是spring提供的一个拓展的感知接口,具体做啥用,怎么用?
我们可以看看源码!
我们找到spring源码中的Aware
接口,看看注释
* A marker superinterface indicating that a bean is eligible to be notified by the
* Spring container of a particular framework object through a callback-style method.
* The actual method signature is determined by individual subinterfaces but should
* typically consist of just one void-returning method that accepts a single argument.
*
* <p>Note that merely implementing {@link Aware} provides no default functionality.
* Rather, processing must be done explicitly, for example in a
* {@link org.springframework.beans.factory.config.BeanPostProcessor}.
* Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor}
* for an example of processing specific {@code *Aware} interface callbacks.
大概意思就是:这是个父接口,spring特定对象通过回调方法,通知通知。然后具体的通知方法通过子接口实现
还说明了,单独实现Aware接口不实现功能,需要定义一个BeanPostProcessor接口的实现类,比如:ApplicationContextAwareProcessor。
二:通过ApplicationContextAwareProcessor了解Aware接口
我们可以看到ApplicationContextAwareProcessor
实现了BeanPostProcessor
接口,再bean初始化前,执行一些aware接口的实现类。
通过invokeAwareInterfaces
方法执行一些aware接口的实现方法。
通过再这些子感知接口初始化的时候通知实现类,从而获取一些ioc对象,去对容器做自己的拓展。
比如:PropertySourcesPlaceholderConfigurer
这个类
public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerSupport implements EnvironmentAware
实现了EnvironmentAware,就看可以通过setEnvironment
方法拿到beanFactory中的environment
对象,代码如下图。
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
拿到环境变量后,可以替换代码中${...}
属性值。
总的来说就是实现一些拓展的时候,需要spring容器获取bean的一些资源,可以通过实现对应的感知接口获取。