Spring源碼-Aware及其子接口

前面說過容器對Bean本身的邏輯基本是無侵入的,因此Bean一般不需要了解容器的狀態和直接使用容器,但是再某些時候需要在Bean中需要獲取到容器的實例來對其操作,這時候就需要再Bean中設定對容器的感知了。
這便是Aware接口的作用。
在這裏插入圖片描述

可以看到該接口沒有任何方法,只能當作標籤來使用。所以真正發揮作用的使實現了該接口的子接口。
在這裏插入圖片描述

ApplicationContextAware

在這裏插入圖片描述
只有一個方法名字,顧名思義就知道支持實現該接口的Bean可以將容器實例作爲參數傳遞進來。
其他的Aware子接口與此類似。
測試
讓自己的控制器實現 ApplicationContextAware, BeanNameAware ,實現他們的方法。

@Controller("welcomeController")
public class WelcomeController  implements ApplicationContextAware, BeanNameAware {
    private String myNme;
    private ApplicationContext muApplication;
    @Autowired
    private WelcomeService welcomeService;
    public void handleRequest(){
        welcomeService.sayHello("來自控制器的問候");
        //測試
        System.out.println("我是誰?"+myNme);
        String[] names = muApplication.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println("通過容器獲得"+name);
        }
    }

    @Override
    public void setBeanName(String name) {
        this.myNme = name;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.muApplication = applicationContext;
    }
}

然後測試handleRequest,調用啓動類,可以得到。

 public static void main(String[] args) {
       ApplicationContext applicationContext =  new AnnotationConfigApplicationContext(Entrance.class);
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        WelcomeController welcomeService = (WelcomeController) applicationContext.getBean("welcomeController");
//        welcomeService.sayHello("強大的Spring");
        welcomeService.handleRequest();
        User user5 = (User) applicationContext.getBean("divUser");
        System.out.println(user5);

    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章