Spring中有很多继承于aware
中的接口,这些接口到底是做什么用到的
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配置文件中初始化两个对象。
1 <bean id="zhangsan" class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User"> 2 <property name="name" value="zhangsan"></property> 3 <property name="address" value="火星"></property> 4 </bean> 5 6 <bean id="lisi" class="com.github.jettyrun.springinterface.demo.aware.beannameaware.User2"> 7 <property name="name" value="lisi"></property> 8 <property name="address" value="火星"></property> 9 </bean>
- main方法测试一下
BeanNameAware
接口所起的作用。1 public static void main(String[] args) { 2 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-beanaware.xml"); 3 4 User user=context.getBean(User.class); 5 System.out.println(String.format("实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s",user.getId(),user.toString())); 6 7 User2 user2=context.getBean(User2.class); 8 System.out.println(String.format("未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s",user2.getId(),user2.toString())); 9 }
- 运行结果
1 实现了BeanNameAware接口的信息BeanId=zhangsan,所有信息=User{id='zhangsan', name='zhangsan', address='火星'} 2 未实现BeanNameAware接口的信息BeanId=null,所有信息=User{id='null', name='lisi', address='火星'}
能够看到,我们在实现了
BeanNameAware
的User
中,获取到了Spring容器中的BeanId
(对应spring配置文件
中的id
属性),而没有实现BeanNameAware
的User2
,则不能获取到Spring容器中的Id属性。所以
BeanNameAware
接口是为了让自身Bean
能够感知到,获取到自身在Spring容器中的id属性。同理,其他的
Aware
接口也是为了能够感知到自身的一些属性。