前面說過容器對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);
}