Spring中有很多继承于aware
中的接口,这些接口到底是做什么用到的。
aware
,翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有Aware
前面的含义。
先举个BeanNameAware
的例子,实现BeanNameAware
接口,可以让该Bean
感知到自身的BeanName
(对应Spring容器的BeanId
属性)属性,举个例子:
BeanNameAware接口的定义:
1
2
3
|
public interface BeanNameAware extends Aware { void setBeanName(String name); } |
定义两个User
,一个实现BeanNameAware
,一个不实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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 + '\ '' + '}' ; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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
2
3
4
5
6
7
8
9
|
< bean id = "zhangsan" class = "com.github.jettyrun.springinterface.demo.aware.beannameaware.User" > < property name = "name" value = "zhangsan" ></ property > < property name = "address" value = "火星" ></ property > </ bean > < bean id = "lisi" class = "com.github.jettyrun.springinterface.demo.aware.beannameaware.User2" > < property name = "name" value = "lisi" ></ property > < property name = "address" value = "火星" ></ property > </ bean > |
-
main方法测试一下
BeanNameAware
接口所起的作用。
1
2
3
4
5
6
7
8
9
|
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:application-beanaware.xml" ); User user=context.getBean(User. class ); System.out.println(String.format( "实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s" ,user.getId(),user.toString())); User2 user2=context.getBean(User2. class ); System.out.println(String.format( "未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s" ,user2.getId(),user2.toString())); } |
运行结果:
实现了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
对象。
到此这篇关于Spring中的aware接口详情的文章就介绍到这了,更多相关aware接口内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.jianshu.com/p/c5c61c31080b