溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現(xiàn)Aware接口的原理及使用方法是什么

發(fā)布時間:2023-04-28 11:38:20 來源:億速云 閱讀:97 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“實現(xiàn)Aware接口的原理及使用方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“實現(xiàn)Aware接口的原理及使用方法是什么”吧!

前言

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

實現(xiàn)Aware接口的原理及使用方法是什么

設計&實現(xiàn)

spring 提供Aware接口機制,給外部的類提供獲取spring內(nèi)部信息的能力。目前spring常用的Aware接口有

實現(xiàn)Aware接口的原理及使用方法是什么

Aware 感知接口

Aware接口,只做標記。類似于Serializable序列化接口,僅標記這個類可以序列化。Aware 僅表示實現(xiàn)類具有在獲取springbean創(chuàng)建過程中的一些內(nèi)部屬性的能力。

/**
 * 只做標記
 * 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的擴展屬性時,給這個bean加上特定的能力

@Override
    protected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) {
        Object bean = null;
        try {
            bean = createBeanInstance(beanDefinition, beanName, args);
            // 注入屬性
            applyPropertyValues(beanName, bean, beanDefinition);
            // 提供給外部的擴展包裝,執(zhí)行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置處理方法
            bean = initializeBean(beanName, bean, beanDefinition);
        } catch (Exception e) {
            throw new RuntimeException("bean create error!", e);
        }
        // 注冊實現(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);
            }
        }
		.....
	}

測試

實現(xiàn) 需要添加特定能力的 Aware接口,實現(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());
    }

實現(xiàn)Aware接口的原理及使用方法是什么

到此,相信大家對“實現(xiàn)Aware接口的原理及使用方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI