1. 程式人生 > 其它 >【Spring】擴充套件點(三):BeanNameAware、ApplicationContextAware、BeanFactoryAware

【Spring】擴充套件點(三):BeanNameAware、ApplicationContextAware、BeanFactoryAware

技術標籤:Spring系列springjava

前言:

本篇我們來看看 BeanNameAware、ApplicationContextAware、BeanFactoryAware 這三個擴充套件介面,把它們放在一起寫是因為作用相似(PS:“Aware” 的意思是"感知到的"):

  1. BeanNameAware 介面只有一個方法 setBeanName()。實現 BeanNameAware 介面的 bean,在 bean 載入的過程中可以獲取到該 bean 的 id。
  2. ApplicationContextAware 介面只有一個方法 setApplicationContext()。實現 ApplicationContextAware 介面的 bean,可以在 bean 載入的過程中可以獲取到 Spring 的 ApplicationContext,從而能夠獲取任意 bean 及大量 IOC 容器資訊
  3. BeanFactoryAware 介面只有一個方法 setBeanFactory()。實現 BeanFactoryAware 介面的 bean,可以在 bean 載入的過程中可以獲取到載入該 bean 的 BeanFactory
public interface BeanNameAware extends Aware {
	void setBeanName(String name);
}

public interface ApplicationContextAware extends Aware {
	void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

public interface BeanFactoryAware extends Aware {
	void setBeanFactory
(BeanFactory beanFactory) throws BeansException; }

下面來看一個示例…

1)寫一個 bean,實現這三個介面

public class TestBean02 implements BeanNameAware, ApplicationContextAware, BeanFactoryAware{
    
    @Override
    public void setBeanName(String name) {
        System.out.println("setBeanName()...beanName=" + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("setApplicationContext()...applicationContext=" + applicationContext);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory()...beanFactory=" + beanFactory);
    }
}

2)配置 applicationContext.xml

<bean id="bean02" class="com.xupt.yzh.pkg_04.TestBean02"></bean>

3)測試程式碼:

public class Main {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

=> 執行結果如下:

在這裡插入圖片描述

PS:如果你的 BeanName、ApplicationContext、BeanFactory 有用,那麼就自己定義一個變數將它們儲存下來;如果沒用,那麼只需要實現setXXX()方法,用一下 Spring 注入進來的引數即可。


問題:如果 bean 還同時實現了 InitializingBean 那麼執行順序如何呢?

1)我們把上面的 bean02 修改一下,實現 InitializingBean 並加上一個屬性及setter

public class TestBean02 implements BeanNameAware, ApplicationContextAware, BeanFactoryAware, InitializingBean {
	
	// 新增一個屬性
	// 目的是演示bean初始化時機
    private String name;
    public void setName(String name) {
        this.name = name;
        System.out.println("setName()..." + name);
    }

	@Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet()...");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("setBeanName()...beanName=" + name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("setApplicationContext()...applicationContext=" + applicationContext);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory()...beanFactory=" + beanFactory);
    }
}

2)修改 applicationContext.xml 給 bean02 新增一個 name 值

<bean id="bean02" class="com.xupt.yzh.pkg_04.TestBean02">
     <property name="name" value="老八"></property>
</bean>

=> 再次啟動容器,執行結果如下

在這裡插入圖片描述

即如果 bean 同時還實現了 InitializingBean,容器會保證 BeanName、ApplicationContext 和 BeanFactory 在呼叫 afterPropertiesSet() 方法前被注入。