前言
这次学习的BeanNameAware接口是在Spring5.3.19的版本之下的,对应的SpringBoot的版本是2.5.13,该接口在下面maven工程中
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.19</version>
</dependency>
学习
该接口在spring中的定义
package org.springframework.beans.factory;
public interface BeanNameAware extends Aware {
void setBeanName(String name);
}
实现该接口的bean可以获取自己在spring容器中的bean名称,该接口有一个抽象方法setBeanName,通过该方法可以将自己在spring容器中的bean名称设置进来。(注意,在代码注解中我们可以看到这样一段解释:此名称是工厂中使用的实际 bean 名称,可能与最初指定的名称不同:特别是对于内部 bean 名称,实际的 bean 名称可能通过附加“#…”后缀而变得唯一)
Demo
1.创建项目,maven引入如下依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.li</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.定义一个Bean类并实现BeanNameAware接口,并使用@Component注解将该类注入Spring容器中
package com.li.demo.aware;
import org.springframework.beans.factory.*;
import org.springframework.stereotype.Component;
@Component
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("setBeanName方法执行了");
System.out.println("beanName:"+ name);
}
}
这里我们没有给@Component注解指定bean名称
3.启动项目后,可以看到打印内容
这时发现bean名称默认是类名首字母小写
如果给@Component注解指定bean名称,如下
package com.li.demo.aware;
import org.springframework.beans.factory.*;
import org.springframework.stereotype.Component;
@Component("haha")
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("setBeanName方法执行了");
System.out.println("beanName:"+ name);
}
}
启动项目后观察打印内容
这时发现bean名称变为@Component注解指定bean名称