spring-BeanNameAware的使用


首先看一個例子,例子內容延續上一篇ApplicationContextAware的使用:

package com.springinit;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringInit implements ApplicationContextAware, BeanNameAware {

    public static ApplicationContext context;

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

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

}

啟動一個spring容器后的打印結果為:

BeanNameAware:springInit
spring init

由此可得出如下結論:

  1. spring容器啟動在生產bean的時候會回調像ApplicationContextAware、BeanNameAware這些接口的方法;
  2. 執行順序上,先執行BeanNameAware接口的setBeanName方法,再執行ApplicationContextAware接口的setApplicationContext方法,執行順序的原理可查看ApplicationContextAware文章的ApplicationContext的生命周期圖;
  3. 對於使用@Component注解納入spring管理的bean,若未設置bean的name,則默認為首字母小寫的bean類名,如SpringInit-springInit。

另外:除了上述兩個Aware后綴的接口外,spring還提供了其他的生命周期的aware接口,比如:BeanFactoryAware、BeanClassLoaderAware等,在某些bean的業務邏輯中若需要用到spring容器的這些屬性,可以采用實現Aware后綴的接口來獲取,用的最多還是ApplicationContextAware來獲取ApplicationContext。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM