Spring的Aware接口你知道多少

 更新时间:2022年02月14日 17:17:20   作者:JavaEdge.  
这篇文章主要为大家详细介绍了Spring的Aware接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

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

Spring 中提供的 Aware 接口有:

  • BeanNameAware:注入当前 bean 对应 beanName
  • BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader
  • BeanFactoryAware:注入 当前BeanFactory容器 的引用

BeanNameAwareBeanFactoryAware都属于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框架。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

相关文章

  • java实现发送邮箱验证码

    java实现发送邮箱验证码

    这篇文章主要为大家详细介绍了java实现发送邮箱验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • springBoot项目如何实现启动多个实例

    springBoot项目如何实现启动多个实例

    这篇文章主要介绍了springBoot项目如何实现启动多个实例的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java网络编程之简单的服务端客户端应用实例

    Java网络编程之简单的服务端客户端应用实例

    这篇文章主要介绍了Java网络编程之简单的服务端客户端应用,以实例形式较为详细的分析了java网络编程的原理与服务器端客户端的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Springmvc ajax跨域请求处理方法实例详解

    Springmvc ajax跨域请求处理方法实例详解

    这篇文章主要介绍了Springmvc ajax跨域请求处理方法实例详解,需要的朋友可以参考下
    2017-10-10
  • lambdaQueryWrapper多条件嵌套查询方式

    lambdaQueryWrapper多条件嵌套查询方式

    这篇文章主要介绍了lambdaQueryWrapper多条件嵌套查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • Java8优雅的字符串拼接工具类StringJoiner实例代码

    Java8优雅的字符串拼接工具类StringJoiner实例代码

    这篇文章主要给大家介绍了关于Java8优雅的字符串拼接工具类StringJoiner的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java中Builder模式的实现详解

    Java中Builder模式的实现详解

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。下面这篇文章主要给大家介绍了在Java各个版本中Builder模式实现的相关资料,文中介绍的非常详细,需要的朋友可以参考学习。
    2017-05-05
  • 解决SecureRandom.getInstanceStrong()引发的线程阻塞问题

    解决SecureRandom.getInstanceStrong()引发的线程阻塞问题

    这篇文章主要介绍了解决SecureRandom.getInstanceStrong()引发的线程阻塞问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java的“Goto”与标签及使用详解

    Java的“Goto”与标签及使用详解

    goto在Java中是一个保留字,但在语言中并没有用到它;Java没有goto。接下来通过本文给大家介绍Java的“Goto”与标签,感兴趣的朋友跟随小编一起看看吧
    2018-10-10
  • 为什么Spring和IDEA都不推荐使用 @Autowired 注解

    为什么Spring和IDEA都不推荐使用 @Autowired 注解

    本文主要介绍了为什么Spring和IDEA都不推荐使用 @Autowired 注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论