探究實(shí)現(xiàn)Aware接口的原理及使用
前言
spring 對bean的創(chuàng)建過程做了很完整的封裝。但是提供了非常多的擴(kuò)展接口,供我們使用。這一節(jié)主要是實(shí)現(xiàn)spring提供的獲取 beanFactory,classLoader 等屬性的能力。 在我們開發(fā)過程中我們經(jīng)常會使用到 ApplicationContextAware接口,來獲取到 spring的上下文。來完成對bean的獲取,當(dāng)拿到了BeanFactory以后,我們能做的東西就多起來了,我們可以通過的spring工廠獲取到我們需要的類,等等。

設(shè)計&實(shí)現(xiàn)
spring 提供Aware接口機(jī)制,給外部的類提供獲取spring內(nèi)部信息的能力。目前spring常用的Aware接口有

Aware 感知接口
Aware接口,只做標(biāo)記。類似于Serializable序列化接口,僅標(biāo)記這個類可以序列化。Aware 僅表示實(shí)現(xiàn)類具有在獲取springbean創(chuàng)建過程中的一些內(nèi)部屬性的能力。
/**
* 只做標(biāo)記
* spring容器感知接口
*/
public interface Aware {
}
提供具體能力的接口
ApplicationContextAware 提供獲取 applicationContext 的能力
public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext applicationContext);
}
BeanClassLoaderAware提供獲取 classLoader 的能力
public interface BeanClassLoaderAware extends Aware{
void setBeanClassLoader(ClassLoader classLoader);
}
BeanFactoryAware 提供獲取 BeanFactory 的能力
public interface BeanFactoryAware extends Aware{
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
BeanNameAware 提供獲取 beanName 的能力
public interface BeanNameAware extends Aware{
void setBeanName(String beanName);
}
他們都在創(chuàng)建bean完成后,在添加bean的擴(kuò)展屬性時,給這個bean加上特定的能力
@Override
protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) {
Object bean = null;
try {
bean = createBeanInstance(beanDefinition, beanName, args);
// 注入屬性
applyPropertyValues(beanName, bean, beanDefinition);
// 提供給外部的擴(kuò)展包裝,執(zhí)行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置處理方法
bean = initializeBean(beanName, bean, beanDefinition);
} catch (Exception e) {
throw new RuntimeException("bean create error!", e);
}
// 注冊實(shí)現(xiàn)了 DisposableBean 接口的 Bean 對象
registerDisposableBeanIfNecessary(beanName, bean, beanDefinition);
registerSingleton(beanName, bean);
return bean;
}
private Object initializeBean(String beanName, Object bean, BeanDefinition beanDefinition) throws BeansException {
if (bean instanceof Aware) {
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this);
}
if (bean instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware) bean).setBeanClassLoader(getClassLoader());
}
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
}
.....
}測試
實(shí)現(xiàn) 需要添加特定能力的 Aware接口,實(shí)現(xiàn)他們的方法
public class UserService implements InitializingBean, DisposableBean, ApplicationContextAware, BeanClassLoaderAware, BeanNameAware {
private ApplicationContext applicationContext;
private ClassLoader classLoader;
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
}
@Test
public void testContext1() throws BeansException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml");
applicationContext.registerShutdownHook();
UserService userService = (UserService) applicationContext.getBean("userService");
System.out.println(userService.say());
System.out.println(userService.getApplicationContext());
System.out.println(userService.getClassLoader());
System.out.println(userService.getBeanName());
}

以上就是探究實(shí)現(xiàn)Aware接口的原理及使用的詳細(xì)內(nèi)容,更多關(guān)于Aware接口原理使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入理解Java責(zé)任鏈模式實(shí)現(xiàn)靈活的請求處理流程
本文詳細(xì)介紹了Java中的責(zé)任鏈模式,幫助您理解其工作原理,以及如何在代碼中實(shí)現(xiàn)。該模式可以將請求沿著處理鏈路傳遞,實(shí)現(xiàn)靈活的請求處理流程。通過本文的學(xué)習(xí),您將獲得在Java應(yīng)用程序中使用責(zé)任鏈模式的知識和技能2023-04-04
SpringBoot中@PostConstruct 注解的實(shí)現(xiàn)
在Spring Boot框架中,?@PostConstruct是一個非常有用的注解,它用于在依賴注入完成后執(zhí)行初始化方法,本文將介紹?@PostConstruct的基本概念、使用場景以及提供詳細(xì)的代碼示例,感興趣的可以了解一下2024-09-09
IDEA配置maven環(huán)境的詳細(xì)教程(Unable to import maven project報錯問題的解決)
這篇文章主要介紹了IDEA配置maven環(huán)境的詳細(xì)教程(Unable to import maven project問題的解決),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢的實(shí)例
本文主要介紹了oracle+mybatis-plus+springboot實(shí)現(xiàn)分頁查詢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
java中instanceof 關(guān)鍵字作用和實(shí)際用途詳解
這篇文章主要介紹了java中instanceof 關(guān)鍵字作用和實(shí)際用途,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
在啟動后臺 jar包時,使用指定的 application.yml操作
這篇文章主要介紹了在啟動后臺 jar包時,使用指定的 application.yml操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
eclipse下搭建hibernate5.0環(huán)境的步驟(圖文)
這篇文章主要介紹了eclipse下搭建hibernate5.0環(huán)境的步驟(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05

