多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Bean直接间接继承了Aware接口,获得了对Spring容器的感知,达到对当前运行环境的获取。 ## Aware系列接口的共性 1. Spring的接口都以“Aware”结尾,自定义的最好也遵守这个规律。 2. 都是Aware接口的子接口,即都继承了Aware接口 3. 接口内均定义了一个set方法(给当前bean注入值) ## Aware系列接口的set方法 (1)父接口Aware中没有定义任何方法,只是一个标识接口 ~~~ public interface Aware { } ~~~ (2)观察一下这些set方法 ApplicationContextAware接口: ~~~ public interface ApplicationContextAware extends Aware { void setApplicationContext(ApplicationContext applicationContext) throws BeansException; } ~~~ BeanNameAware接口: ~~~ public interface BeanNameAware extends Aware { void setBeanName(String name); } ~~~ BeanClassLoaderAware接口: ~~~ public interface BeanClassLoaderAware extends Aware { void setBeanClassLoader(ClassLoader classLoader); } ~~~ ApplicationContextAware接口:“Aware”前面的“ApplicationContext”就是我们需要Aware(知道,获取)的内容。 set方法的形参ApplicationContext applicationContext就用于接收我们需要获取的那个对象。 会把我们需要Aware的内容,注给set方法的形参,我们需要定义一个成员属性来保存形参。 (五)代码示例: //实现BeanNameAware接口,才能获取bean在IOC容器中的id //还可以实现ApplicationContextAware接口,用于获取bean所在的IOC容器 ~~~ public class HelloWorld implements BeanNameAware{ private String beanName; @Override public void setBeanName(String name) {//id会被传给形参name this.beanName=name;//把id保存在成员属性beanName中 } public String getBeanName(){ return beanName; } } ~~~ 在 bean配置文件中,注册一个id为“hello”的bean: <bean class="com.HelloWorld" id="hello"></bean> 1 ~~~ public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorld h=(HelloWorld)context.getBean("hello"); System.out.println(h.getBeanName()); } ~~~ 输出结果: hello Aware系列接口,用于辅助Spring bean访问Spring容器; Aware系列接口,都定义了一个set 方法,体现了set方法注入的思想; 这些接口的作用与@Autowired、@Resource等注解有点类似; 在Struts2中,也有Aware系列接口:RequestAware;SessionAware;ApplicationAware;ParameterAware等。这些接口的设计思想和Spring里面的Aware系列接口的设计思想是一致的。