从Bean里获取到容器实例并对其进行操作( 类名如果是xxxAware,xxx就是可以获取到的)
public interface Aware {}
仅仅是个空的接口,只能当做标签来使用,真正能发挥作用的是继承了这个接口的子接口。
当类需要容器提供帮助的时候,就需要向容器证明类本身是可以感知到容器的存在的,即实现特定类型的aware接口。
ApplicationContextAware
public interface ApplicationContextAware extends Aware { void setApplicationContext(ApplicationContext applicationContext) throws BeansException; }
实现了该接口的bean,在容器创建这个bean实例的时候,将容器本身的实例作为参数传进来给这个bean使用
BeanNameAware
package org.springframework.beans.factory; public interface BeanNameAware extends Aware { void setBeanName(String name); }
方法的作用是将bean的名字传进来供接口实现类使用。
其他的
BeanFactoryAware主要是用于获取当前的BeanFactory,这样就可以调用容器服务
MessageSourceAware是用来获取MessageSource相关的文本信息
ApplicationEventPublisherAware是用来获取发布器实例以发布事件
ResourceLoaderAware主要是用来获取资源加载器的,通过资源加载器可以获取外部资源加载文件
每一个Aware都会有一个对应的set
可以修改WelcomeController来进行一个测试:
点击获取源码
package com.wjw.controller; import com.wjw.service.WelcomeService; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Controller; @Controller public class WelcomeController implements ApplicationContextAware, BeanNameAware { private String myName; private ApplicationContext myContainer; @Autowired private WelcomeService welcomeService; public void handleRequest(){ welcomeService.sayHello("来自Controller的问候"); System.out.println("I am:" + myName); String[] beanDefinitionNames = myContainer.getBeanDefinitionNames(); for(String beanDefinitionName : beanDefinitionNames) { System.out.println("I get:" + beanDefinitionName); } } @Override public void setBeanName(String name) { this.myName = name; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.myContainer = applicationContext; } }
注意:想要获取容器提供的支援,除了实现aware接口之外,本身还必须是被容器管理的bean才行。