Spring中的Aware接口及应用场景
Aware接口是Spring Framework中提供的一组标记接口,用于在Bean装配的过程中获取Spring容器中提供的一些核心组件或运行时上下文等信息。通过使用Aware接口,我们可以在Bean实例化和初始化过程中获取到Spring容器中其他组件,方便Bean类实现更复杂的业务逻辑。
本文将会一一介绍Spring中各个Aware接口,以及这些接口的主要应用场景。
1. ApplicationContextAware
ApplicationContextAware接口可以让Bean获取到ApplicationContext对象,通过这个对象,我们可以获取Spring容器中的其他Bean实例或一些组件。常见的应用场景包括:
- 在Web项目中获取ServletContext
- 获取国际化信息
- 获取Scheduler等定时任务
示例代码:
public class MyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void doSomething() {
// 获取其他的Bean实例或其他的组件
OtherBean otherBean = applicationContext.getBean("otherBean", OtherBean.class);
// ...
}
}
2. BeanFactoryAware
BeanFactoryAware接口可以让Bean获取到BeanFactory对象,通过这个对象,我们可以获取Spring容器中的Bean实例或一些组件。常见的应用场景包括:
- 获取Spring容器中的Bean实例
- 手动注册BeanDefinition
示例代码:
public class MyBean implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void doSomething() {
// 获取其他的Bean实例或其他的组件
OtherBean otherBean = beanFactory.getBean("otherBean", OtherBean.class);
// ...
}
}
3. MessageSourceAware
MessageSourceAware接口可以让Bean获取到MessageSource对象,通过这个对象,我们可以方便地进行国际化操作。常见的应用场景包括:
- 获取国际化信息
示例代码:
public class MyBean implements MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
public void doSomething() {
// 获取国际化信息
String message = messageSource.getMessage("key", null, Locale.getDefault());
// ...
}
}
4. ResourceLoaderAware
ResourceLoaderAware接口可以让Bean获取到ResourceLoader对象,通过这个对象,我们可以方便地进行资源加载操作。常见的应用场景包括:
- 加载配置文件
- 加载图片等静态资源
示例代码:
public class MyBean implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public void doSomething() {
// 加载配置文件
Resource resource = resourceLoader.getResource("classpath:config.xml");
// ...
}
}
5. ServletContextAware
ServletContextAware接口可以让Bean获取到ServletContext对象,通过这个对象,我们可以方便地进行Web项目开发。常见的应用场景包括:
- 获取Web项目的一些信息,如上下文路径等
示例代码:
public class MyBean implements ServletContextAware {
private ServletContext servletContext;
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void doSomething() {
// 获取上下文路径
String contextPath = servletContext.getContextPath();
// ...
}
}
6. EnvironmentAware
EnvironmentAware接口可以让Bean获取到Environment对象,通过这个对象,我们可以方便地获取Spring的环境配置信息。常见的应用场景包括:
- 获取当前的环境配置,如开发环境、测试环境或生产环境
- 获取配置文件中的属性值
示例代码:
public class MyBean implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public void doSomething() {
// 获取当前环境
String profile = environment.getActiveProfiles()[0];
// 获取配置文件中的属性值
String value = environment.getProperty("key");
// ...
}
}
7. ServletConfigAware
ServletConfigAware接口可以让Bean获取到ServletConfig对象,通过这个对象,我们可以方便地获取Servlet的相关信息。常见的应用场景包括:
- 获取Servlet的名称
- 获取Servlet的初始化参数
示例代码:
public class MyServlet extends HttpServlet implements ServletConfigAware {
private ServletConfig servletConfig;
@Override
public void setServletConfig(ServletConfig servletConfig) {
this.servletConfig = servletConfig;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 获取Servlet的名称
String servletName = servletConfig.getServletName();
// 获取Servlet的初始化参数
String value = servletConfig.getInitParameter("key");
// ...
}
}
8. ApplicationContextInitializer
ApplicationContextInitializer接口是Spring提供的一个接口,我们可以在Spring容器初始化之前做一些必要的操作,常见的应用场景包括:
- 修改配置信息
- 注册BeanDefinition
示例代码:
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// 注册BeanDefinition
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(OtherBean.class);
beanDefinition.setPropertyValues(new MutablePropertyValues());
((DefaultListableBeanFactory) applicationContext.getBeanFactory()).registerBeanDefinition("otherBean", beanDefinition);
// ...
}
}
9. EmbeddedValueResolverAware
EmbeddedValueResolverAware接口可以让Bean获取到EmbeddedValueResolver对象,通过这个对象,我们可以方便地替换属性占位符。常见的应用场景包括:
- 替换配置文件中的占位符
示例代码:
public class MyBean implements EmbeddedValueResolverAware {
private EmbeddedValueResolver embeddedValueResolver;
@Override
public void setEmbeddedValueResolver(EmbeddedValueResolver embeddedValueResolver) {
this.embeddedValueResolver = embeddedValueResolver;
}
public void doSomething() {
// 获取属性值
String value = embeddedValueResolver.resolveStringValue("${key}");
// ...
}
}
10. LoadTimeWeaverAware
LoadTimeWeaverAware接口可以让Bean获取到LoadTimeWeaver对象,通过这个对象,我们可以实现类的动态加载。常见的应用场景包括:
- 动态加载类 示例代码:
public class MyBean implements LoadTimeWeaverAware {
private LoadTimeWeaver loadTimeWeaver;
@Override
public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {
this.loadTimeWeaver = loadTimeWeaver;
}
public void doSomething() {
// 动态加载类
ClassLoader classLoader = loadTimeWeaver.getClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.OtherClass");
// ...
}
}
11. ApplicationEventPublisherAware
ApplicationEventPublisherAware接口可以让Bean获取到ApplicationEventPublisher对象,通过这个对象,我们可以方便地发布和监听事件。常见的应用场景包括:
- 实现自定义事件
- 监听Spring容器事件
示例代码:
public class MyBean implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void doSomething() {
// 发布事件
applicationEventPublisher.publishEvent(new MyEvent(this, "event data"));
// ...
}
}
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
// 处理事件
// ...
}
}
12. ConversionServiceAware
ConversionServiceAware接口可以让Bean获取到ConversionService对象,通过这个对象,我们可以方便地进行类型转换。常见的应用场景包括:
- 类型转换
- 数据校验
示例代码:
public class MyBean implements ConversionServiceAware {
private ConversionService conversionService;
@Override
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
public void doSomething() {
// 类型转换
String str = "123";
Integer value = conversionService.convert(str, Integer.class);
// ...
}
}
在使用Aware接口时,需要注意避免循环依赖和过度依赖的问题。另外,Aware接口的实现可以通过XML、注解或编程方式来实现。
以上就是Spring中各个Aware接口的应用场景和示例代码,希望对大家在实际开发中使用Spring有一定的帮助。
转载自:https://juejin.cn/post/7229485914219610173