Spring的几个aware接口的用法
ApplicationContextAware
public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
该接口仅有一个方法,用于设置Spring容器上下文。在填充普通bean属性之后,初始化回调或自定义初始化方法之前调用。
eg:
package com.alone.simpleusage.aware;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class MyApplicationContextAware implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
System.out.println(context.getClass());
}
public static ApplicationContext getApplicationContext() {
return context;
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
}
BeanFactoryAware
public interface BeanFactoryAware extends Aware {
void setBeanFactory(BeanFactory var1) throws BeansException;
}
该接口也只定义了一个方法,通过该方法设置容器的BeanFactory,进而可以操作要在Spring容器中注入的bean。在填充普通bean属性之后,初始化回调或自定义初始化方法之前调用。
BeanNameAware
public interface BeanNameAware extends Aware {
void setBeanName(String var1);
}
通过该方法设置bean的名称。在填充普通bean属性之后,初始化回调或自定义初始化方法之前调用。
BeanClassLoaderAware
public interface BeanClassLoaderAware extends Aware {
void setBeanClassLoader(ClassLoader var1);
}
通过该方法设置bean的classloader。在填充普通bean属性之后,初始化回调或自定义初始化方法之前调用。
以上几个aware接口的执行顺序:
使用Aware接口的含义
使用Aware接口可以获取某些容器对象的方法,此外@Autowired 的解析需要用到 bean 后处理器,属于扩展功能。而 Aware 接口属于内置功能,不加任何扩展,Spring 就能识别。某些情况下, 扩展功能会失效, 而内置功能不会失效。
spring生命周期有关方法步骤图
spring启动流程
首先从以下方法开始:
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent);
// 设置配置文件位置
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
super(parent)
在上层AbstractApplicationContext
中找到了方法的具体实现。
public AbstractApplicationContext(@Nullable ApplicationContext parent) {
this();
setParent(parent);
}
其中this()
方法是设置了配置资源的解析器ResourcePatternResolver
,类型为PathMatchingResourcePatternResolver
setParent
方法是为了设置父容器
参考资料
- 最佳解读整理 SPRING BEAN生命周期:使用SPRING AWARE接口
- Spring原理学习(四)Aware 接口