Spring中的Aware接口及應(yīng)用場(chǎng)景詳解
Aware接口是Spring Framework中提供的一組標(biāo)記接口,用于在Bean裝配的過(guò)程中獲取Spring容器中提供的一些核心組件或運(yùn)行時(shí)上下文等信息。
通過(guò)使用Aware接口,我們可以在Bean實(shí)例化和初始化過(guò)程中獲取到Spring容器中其他組件,方便Bean類實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。
本文將會(huì)一一介紹Spring中各個(gè)Aware接口,以及這些接口的主要應(yīng)用場(chǎng)景。
1. ApplicationContextAware
ApplicationContextAware接口可以讓Bean獲取到ApplicationContext對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以獲取Spring容器中的其他Bean實(shí)例或一些組件。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 在Web項(xiàng)目中獲取ServletContext
- 獲取國(guó)際化信息
- 獲取Scheduler等定時(shí)任務(wù)
示例代碼:
public class MyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void doSomething() {
// 獲取其他的Bean實(shí)例或其他的組件
OtherBean otherBean = applicationContext.getBean("otherBean", OtherBean.class);
// ...
}
}
2. BeanFactoryAware
BeanFactoryAware接口可以讓Bean獲取到BeanFactory對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以獲取Spring容器中的Bean實(shí)例或一些組件。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 獲取Spring容器中的Bean實(shí)例
- 手動(dòng)注冊(cè)BeanDefinition
示例代碼:
public class MyBean implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void doSomething() {
// 獲取其他的Bean實(shí)例或其他的組件
OtherBean otherBean = beanFactory.getBean("otherBean", OtherBean.class);
// ...
}
}
3. MessageSourceAware
MessageSourceAware接口可以讓Bean獲取到MessageSource對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地進(jìn)行國(guó)際化操作。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 獲取國(guó)際化信息
示例代碼:
public class MyBean implements MessageSourceAware {
private MessageSource messageSource;
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
public void doSomething() {
// 獲取國(guó)際化信息
String message = messageSource.getMessage("key", null, Locale.getDefault());
// ...
}
}
4. ResourceLoaderAware
ResourceLoaderAware接口可以讓Bean獲取到ResourceLoader對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地進(jìn)行資源加載操作。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 加載配置文件
- 加載圖片等靜態(tài)資源
示例代碼:
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對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地進(jìn)行Web項(xiàng)目開(kāi)發(fā)。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 獲取Web項(xiàng)目的一些信息,如上下文路徑等
示例代碼:
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對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地獲取Spring的環(huán)境配置信息。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 獲取當(dāng)前的環(huán)境配置,如開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境或生產(chǎn)環(huán)境
- 獲取配置文件中的屬性值
示例代碼:
public class MyBean implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public void doSomething() {
// 獲取當(dāng)前環(huán)境
String profile = environment.getActiveProfiles()[0];
// 獲取配置文件中的屬性值
String value = environment.getProperty("key");
// ...
}
}
7. ServletConfigAware
ServletConfigAware接口可以讓Bean獲取到ServletConfig對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地獲取Servlet的相關(guān)信息。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 獲取Servlet的名稱
- 獲取Servlet的初始化參數(shù)
示例代碼:
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的初始化參數(shù)
String value = servletConfig.getInitParameter("key");
// ...
}
}
8. ApplicationContextInitializer
ApplicationContextInitializer接口是Spring提供的一個(gè)接口,我們可以在Spring容器初始化之前做一些必要的操作,
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 修改配置信息
- 注冊(cè)BeanDefinition
示例代碼:
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// 注冊(cè)BeanDefinition
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(OtherBean.class);
beanDefinition.setPropertyValues(new MutablePropertyValues());
((DefaultListableBeanFactory) applicationContext.getBeanFactory()).registerBeanDefinition("otherBean", beanDefinition);
// ...
}
}
9. EmbeddedValueResolverAware
EmbeddedValueResolverAware接口可以讓Bean獲取到EmbeddedValueResolver對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地替換屬性占位符。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 替換配置文件中的占位符
示例代碼:
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對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以實(shí)現(xiàn)類的動(dòng)態(tài)加載。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 動(dòng)態(tài)加載類
示例代碼:
public class MyBean implements LoadTimeWeaverAware {
private LoadTimeWeaver loadTimeWeaver;
@Override
public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {
this.loadTimeWeaver = loadTimeWeaver;
}
public void doSomething() {
// 動(dòng)態(tài)加載類
ClassLoader classLoader = loadTimeWeaver.getClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.OtherClass");
// ...
}
}
11. ApplicationEventPublisherAware
ApplicationEventPublisherAware接口可以讓Bean獲取到ApplicationEventPublisher對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地發(fā)布和監(jiān)聽(tīng)事件。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 實(shí)現(xiàn)自定義事件
- 監(jiān)聽(tīng)Spring容器事件
示例代碼:
public class MyBean implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void doSomething() {
// 發(fā)布事件
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對(duì)象,通過(guò)這個(gè)對(duì)象,我們可以方便地進(jìn)行類型轉(zhuǎn)換。
常見(jiàn)的應(yīng)用場(chǎng)景包括:
- 類型轉(zhuǎn)換
- 數(shù)據(jù)校驗(yàn)
示例代碼:
public class MyBean implements ConversionServiceAware {
private ConversionService conversionService;
@Override
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
public void doSomething() {
// 類型轉(zhuǎn)換
String str = "123";
Integer value = conversionService.convert(str, Integer.class);
// ...
}
}
在使用Aware接口時(shí),需要注意避免循環(huán)依賴和過(guò)度依賴的問(wèn)題。另外,Aware接口的實(shí)現(xiàn)可以通過(guò)XML、注解或編程方式來(lái)實(shí)現(xiàn)。
總結(jié)
以上就是Spring中各個(gè)Aware接口的應(yīng)用場(chǎng)景和示例代碼,希望對(duì)大家在實(shí)際開(kāi)發(fā)中使用Spring有一定的幫助。也希望大家多多支持腳本之家。
相關(guān)文章
java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解
在本篇文章里小編給大家整理的是一篇關(guān)于java jvm兩種存儲(chǔ)區(qū)的類型知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03
Java數(shù)據(jù)結(jié)構(gòu)之線段樹(shù)詳解
線段樹(shù)是一種二叉搜索樹(shù),與區(qū)間樹(shù)相似,它將一個(gè)區(qū)間劃分成一些單元區(qū)間,每個(gè)單元區(qū)間對(duì)應(yīng)線段樹(shù)中的一個(gè)葉結(jié)點(diǎn)。本文將介紹線段樹(shù)的Java實(shí)現(xiàn)代碼,需要的可以參考一下2022-01-01
java面向?qū)ο蠡A(chǔ)_final詳細(xì)介紹
本文將詳細(xì)介紹java final 對(duì)象的使用,需要了解更多的朋友可以參考下2012-11-11
總結(jié)一下關(guān)于在Java8中使用stream流踩過(guò)的一些坑
java8新增了stream流式處理,對(duì)于list的各種操作處理提供了好多方法 ,用過(guò)的都知道,方便極了.比如篩選、排序、合并、類型轉(zhuǎn)換等等.以下是我實(shí)際工作中踩過(guò)的坑,記錄下避免大家踩坑,需要的朋友可以參考下2021-06-06
Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)遍歷兩個(gè)MAC地址之間所有MAC的方法,涉及Java針對(duì)MAC的遍歷獲取與字符串轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)
我們?cè)谶M(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個(gè)客戶端連接,是一種非常消耗線程的行為.那么我們?cè)撏ㄟ^(guò)什么技術(shù)去解決上述的問(wèn)題呢,那么就不得不提一個(gè)網(wǎng)絡(luò)連接的利器——Netty,需要的朋友可以參考下2021-06-06
springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案)
雙Token方案通過(guò)訪問(wèn)令牌和刷新令牌提高用戶登錄安全性和體驗(yàn),訪問(wèn)令牌有效期短,包含用戶信息,用于請(qǐng)求校驗(yàn),本文就來(lái)介紹一下springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案),感興趣的可以了解一下2024-10-10

