Spring Aware接口详解

简介: 若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。

若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。


Spring 中提供的 Aware 接口有:


BeanNameAware:注入当前 bean 对应 beanName

BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader

BeanFactoryAware:注入 当前BeanFactory容器 的引用

1.png


BeanNameAware和BeanFactoryAware都属于org.springframework.beans.factory.Aware根标记接口。


其使用setter注入来在应用程序上下文启动期间获取对象。


Aware接口是回调,监听器和观察者设计模式的混合,它表示bean有资格通过回调方式被Spring容器通知。


1 BeanNameAware


使对象能够知道容器中定义的bean名称。


public class MyBeanName implements BeanNameAware {

   @Override

   public void setBeanName(String beanName) {

       System.out.println(beanName);

   }

}


beanName属性表示在Spring容器中注册的bean id,在我们的实现中,只是显示bean名称。


在Spring配置类中注册这种类型的bean:


@Configuration

public class Config {

   @Bean(name = "myCustomBeanName")

   public MyBeanName getMyBeanName() {

       return new MyBeanName();

   }

}


启动应用程序上下文并从中获取bean:


AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

MyBeanName myBeanName = context.getBean(MyBeanName.class);


setBeanName方法打印出了“myCustomBeanName”。


若从@Bean注解中删除name =“…”代码,则在这种情况下,将getMyBeanName()方法名称分配给bean,所以输出将是“getMyBeanName”。


2 BeanFactoryAware


用于注入BeanFactory对象,就能访问创建对象的BeanFactory。


public class MyBeanFactory implements BeanFactoryAware {

   private BeanFactory beanFactory;

   @Override

   public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

       this.beanFactory = beanFactory;

   }

   public void getMyBeanName() {

       MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);

       System.out.println(beanFactory.isSingleton("myCustomBeanName"));

   }

}


在setBeanFactory()方法的帮助下,我们将IoC容器中的BeanFactory引用分配给beanFactory属性。


然后,我们可以像在getMyBeanName()函数中一样直接使用它。


初始化MyBeanFactory并调用getMyBeanName()方法:


MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);

myBeanFactory.getMyBeanName();


由于我们已经在前面的示例中实例化了MyBeanName类,因此Spring将在此处调用现有实例。


3 适用场景


获取bean名称以进行日志记录或埋点,对于BeanFactoryAware,它可以使用扩展代码中的spring bean。


大多数情况下,应避免使用任何Aware接口,因为实现这些接口会将代码耦合到Spring框架。

目录
相关文章
|
22天前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
|
2月前
|
前端开发 安全 Java
Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
43 0
|
2月前
|
传感器 Java API
Spring揭秘:Aware接口应用场景及实现原理!
Aware接口赋予了Bean更多自感知的能力,通过实现不同的Aware接口,Bean可以轻松地获取到Spring容器中的其他资源引用,像ApplicationContext、BeanFactory等。 这样不仅增强了Bean的功能,还提高了代码的可维护性和扩展性,从而让Spring的IoC容器变得更加强大和灵活。
130 0
Spring揭秘:Aware接口应用场景及实现原理!
|
5天前
|
Java Spring
spring boot访问接口报500
spring boot访问接口报500
11 2
|
16天前
|
Java 数据库连接 数据库
spring+mybatis_编写一个简单的增删改查接口
spring+mybatis_编写一个简单的增删改查接口
16 2
|
28天前
|
算法 NoSQL Java
限流艺术:Spring Boot接口限流的实用指南
限流艺术:Spring Boot接口限流的实用指南
63 0
限流艺术:Spring Boot接口限流的实用指南
|
2月前
|
数据采集 前端开发 NoSQL
Spring Boot反爬虫,防止接口盗刷
Spring Boot反爬虫,防止接口盗刷
26 1
|
2月前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
9 0
|
2月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——接口(BaseDao)
使用JDBCTemplate实现与Spring结合,方法公用 ——接口(BaseDao)
9 0