Spring中有很多继承于aware
中的接口,这些接口到底是做什么用到的。
![](http://upload-images.jianshu.io/upload_images/3397380-6ef519bbc705ce28.png?imageMogr2/auto-orient/strip|imageView2/2/w/654/format/webp)
aware
,翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有Aware
前面的含义。
先举个BeanNameAware
的例子,实现BeanNameAware
接口,可以让该Bean
感知到自身的BeanName
(对应Spring容器的BeanId
属性)属性,举个例子:
-
BeanNameAware
接口的定义
public interface BeanNameAware extends Aware {
void setBeanName(String name);
}
- 定义两个
User
,一个实现BeanNameAware
,一个不实现。
package com.github.jettyrun.springinterface.demo.aware.beannameaware;
import org.springframework.beans.factory.BeanNameAware;
/**
-
Created by jetty on 18/1/31.
*/
public class User implements BeanNameAware{private String id;
private String name;
private String address;
public void setBeanName(String beanName) {
//ID保存BeanName的值
id=beanName;
}public String getId() {
return id;
}public void setId(String id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getAddress() {
return address;
}public void setAddress(String address) {
this.address = address;
}@Override
public String toString() {
return “User{” +
“id=’” + id + ‘’’ +
“, name=’” + name + ‘’’ +
“, address=’” + address + ‘’’ +
‘}’;
}
}
package com.github.jettyrun.springinterface.demo.aware.beannameaware;
import org.springframework.beans.factory.BeanNameAware;
/**
-
Created by jetty on 18/1/31.
*/
public class User2 {private String id;
private String name;
private String address;
public String getId() {
return id;
}public void setId(String id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getAddress() {
return address;
}public void setAddress(String address) {
this.address = address;
}@Override
public String toString() {
return “User{” +
“id=’” + id + ‘’’ +
“, name=’” + name + ‘’’ +
“, address=’” + address + ‘’’ +
‘}’;
}
}
- 在Spring配置文件中初始化两个对象。
<bean id="zhangsan" class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User"> <property name="name" value="zhangsan"></property> <property name="address" value="火星"></property> </bean>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>bean</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>lisi<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>com.github.jettyrun.springinterface.demo.aware.beannameaware.User2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>name<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>lisi<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>property</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>address<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>火星<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>property</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>bean</span><span class="token punctuation">></span></span>
- main方法测试一下
BeanNameAware
接口所起的作用。
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-beanaware.xml");
<span class="token class-name">User</span> user<span class="token operator">=</span>context<span class="token punctuation">.</span><span class="token function">getBean</span><span class="token punctuation">(</span><span class="token class-name">User</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s"</span><span class="token punctuation">,</span>user<span class="token punctuation">.</span><span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>user<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">User2</span> user2<span class="token operator">=</span>context<span class="token punctuation">.</span><span class="token function">getBean</span><span class="token punctuation">(</span><span class="token class-name">User2</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s"</span><span class="token punctuation">,</span>user2<span class="token punctuation">.</span><span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>user2<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
- 运行结果
实现了BeanNameAware接口的信息BeanId=zhangsan,所有信息=User{id='zhangsan', name='zhangsan', address='火星'}
未实现BeanNameAware接口的信息BeanId=null,所有信息=User{id='null', name='lisi', address='火星'}
能够看到,我们在实现了BeanNameAware
的 User
中,获取到了Spring容器中的BeanId
(对应spring配置文件
中的id
属性),而没有实现BeanNameAware
的User2
,则不能获取到Spring容器中的Id属性。
所以BeanNameAware
接口是为了让自身Bean
能够感知到,获取到自身在Spring容器中的id属性。
同理,其他的Aware
接口也是为了能够感知到自身的一些属性。
比如实现了ApplicationContextAware
接口的类,能够获取到ApplicationContext
,实现了BeanFactoryAware
接口的类,能够获取到BeanFactory
对象。