返回顶部
首页 > 资讯 > 后端开发 > Python >Spring高级接口Aware浅析
  • 364
分享到

Spring高级接口Aware浅析

SpringAwareSpringAware接口 2023-01-30 09:01:33 364人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录Aware 接口功能阐述功能案例演示扩展功能失效场景分析总结Aware 接口功能阐述 Aware 接口提供了一种【内置】 的注入手段,例如 a.BeanNameAware 注入

Aware 接口功能阐述

Aware 接口提供了一种【内置】 的注入手段,例如

a.BeanNameAware 注入 bean 的名字

b.BeanFactoryAware 注入 BeanFactory 容器

c.ApplicationContextAware 注入 ApplicationContext 容器

d.EmbeddedValueResolverAware 注入 ${} 解析器

功能案例演示

public class MyBean implements BeanNameAware, ApplicationContextAware, InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(MyBean.class);
    @Override
    public void setBeanName(String name) {
        log.debug("当前bean " + this + " 名字叫:" + name);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.debug("当前bean " + this + " 容器是:" + applicationContext);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        log.debug("当前bean " + this + " 初始化");
    }
    @Autowired
    public void aaa(ApplicationContext applicationContext) {
        log.debug("当前bean " + this + " 使用@Autowired 容器是:" + applicationContext);
    }
    @PostConstruct
    public void init() {
        log.debug("当前bean " + this + " 使用@PostConstruct 初始化");
    }
}

测试

  GenericApplicationContext context = new GenericApplicationContext();   
  context.reGISterBean("myBean", MyBean.class);
  context.refresh(); 
  context.close();

可能这里有人会有疑问: b、c、d 的功能用 @Autowired 就能实现啊, 为啥还要用 Aware 接口呢

简单地说:

a.@Autowired 的解析需要用到 bean 后处理器, 属于扩展功能

b.而 Aware 接口属于内置功能, 不加任何扩展, spring 就能识别

某些情况下, 扩展功能会失效, 而内置功能不会失效

如下所示:

  @Autowired
    public void aaa(ApplicationContext applicationContext) {
        log.debug("当前bean " + this + " 使用@Autowired 容器是:" + applicationContext);
    }
    @PostConstruct
    public void init() {
        log.debug("当前bean " + this + " 使用@PostConstruct 初始化");
    }

在这里,你会发现用 Aware 注入 ApplicationContext 成功, 而 @Autowired 注入 ApplicationContext 失败

扩展功能失效场景分析

@Configuration
public class MyConfig1 {
    private static final Logger log = LoggerFactory.getLogger(MyConfig1.class);
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        log.debug("注入 ApplicationContext");
    }
    @PostConstruct
    public void init() {
        log.debug("初始化");
    }
    @Bean //  beanFactory 后处理器
    public BeanFactoryPostProcessor processor1() {
        return beanFactory -> {
            log.debug("执行 processor1");
        };
    }
}
context.refresh(); 

这行代码的执行顺序,到容器里找到所有的.beanFactory 后处理器来执行,添加 bean 后处理器,初始化单例。

Java 配置类不包含 BeanFactoryPostProcessor 的情况

Java 配置类包含 BeanFactoryPostProcessor 的情况,因此要创建其中的 BeanFactoryPostProcessor 必须提前创建 Java 配置类,而此时的 BeanPostProcessor 还未准备好,导致 @Autowired 等注解失效

对应代码

@Configuration
public class MyConfig1 {
    private static final Logger log = LoggerFactory.getLogger(MyConfig1.class);
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        log.debug("注入 ApplicationContext");
    }
    @PostConstruct
    public void init() {
        log.debug("初始化");
    }
    @Bean //  ⬅️ 注释或添加 beanFactory 后处理器对应上方两种情况
    public BeanFactoryPostProcessor processor1() {
        return beanFactory -> {
            log.debug("执行 processor1");
        };
    }
}

注意

解决方法:

  • 用内置依赖注入和初始化取代扩展依赖注入和初始化
  • 用静态工厂方法代替实例工厂方法,避免工厂对象提前被创建

测试:

 GenericApplicationContext context = new GenericApplicationContext();
 context.registerBean("myConfig2", MyConfig2.class);
 context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
 context.registerBean(CommonAnnotationBeanPostProcessor.class);
 context.registerBean(ConfigurationClassPostProcessor.class);
 context.refresh();
 context.close();

输出结果:

总结

  • Aware 接口提供了一种【内置】 的注入手段, 可以注入 BeanFactory, ApplicationContext
  • InitializingBean 接口提供了一种【内置】的初始化手段
  • 内置的注入和初始化不受扩展功能的影响, 总会被执行, 因此 Spring 框架内部的类常用它们

到此这篇关于Spring高级接口Aware浅析的文章就介绍到这了,更多相关Spring Aware内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring高级接口Aware浅析

本文链接: https://lsjlt.com/news/178702.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring高级接口Aware浅析
    目录Aware 接口功能阐述功能案例演示扩展功能失效场景分析总结Aware 接口功能阐述 Aware 接口提供了一种【内置】 的注入手段,例如 a.BeanNameAware 注入 ...
    99+
    2023-01-30
    Spring Aware Spring Aware接口
  • 浅析对Spring aware接口理解
    目录1. aware接口的作用2. 常用aware接口及作用3. 使用样例:ApplicationContextAware 在Bean中获取上下文4. 自定义aware的方式4.1 ...
    99+
    2024-04-02
  • Spring中的aware接口详情
    Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的。 aware,翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有Aware前面...
    99+
    2024-04-02
  • Spring Aware接口示例代码详解
    若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资...
    99+
    2024-04-02
  • Spring的Aware接口你知道多少
    若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资...
    99+
    2024-04-02
  • 详解spring中的Aware接口功能
    目录一,ApplicationContextAware二、ApplicationEventPublisherAware在spring中有很多以XXXAware命名的接口,很多人也不清...
    99+
    2024-04-02
  • Spring中Aware接口的实现原理是什么
    今天就跟大家聊聊有关Spring中Aware接口的实现原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用示例:@Component&nbs...
    99+
    2024-04-02
  • Spring中的bean怎么利用Aware接口获取
    这期内容当中小编将会给大家带来有关Spring中的bean怎么利用Aware接口获取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在使用spring编程时,常常会遇到想根据bean的名称来获取相应的bea...
    99+
    2023-05-31
    spring bean aware
  • Spring的Aware接口实现及执行顺序详解
    目录一、实现了Aware的接口二、为什么要使用 Aware 接口三、Aware接口执行顺序一、实现了Aware的接口 Spring中有很多继承于aware中的接口,这些接口到底是做什...
    99+
    2022-12-26
    Spring Aware接口执行顺序 Spring Aware
  • Java_Cloneable 接口浅析
    Java中的Cloneable接口是一个标记接口,用于指示实现了该接口的类可以进行对象的克隆(复制)操作。1. 标记接口:Clone...
    99+
    2023-09-21
    Java
  • 浅析Django接口版本控制
    目录一、前言二、配置2.1、全局配置2.2、视图配置三、drf内置的5个版本控制类3.1、AcceptHeaderVersioning3.1.1、http访问方式3.1.2、sett...
    99+
    2024-04-02
  • Python接口自动化浅析如何处理接口依赖
    在前面的Python接口自动化测试系列文章:Python接口自动化浅析logging封装及实战操作, 其中介绍了将logging常用配置放入yaml配置文件、logging日志封装及...
    99+
    2024-04-02
  • Python接口自动化浅析登录接口测试实战
    目录1、什么是接口?那么,接口测试和功能测试的区别在哪呢?2、如何开展接口测试?3、如何设计接口用例?1.获取接口文档Fiddler2.分析接口文档的接口,提取测试点3.接口测试用例...
    99+
    2024-04-02
  • 深入浅析Spring的数据库连接池
    深入浅析Spring的数据库连接池?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库连接池对一个简单的数据库应用,由于对数据库的访问不是很频繁,这时可以简单地...
    99+
    2023-05-31
    spring 数据库连接池
  • 深入浅析Android接口回调机制
    在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的...
    99+
    2022-06-06
    回调 android接口回调 Android
  • golang中什么是接口?(用法浅析)
    Golang 是一种非常流行的编程语言,其提供了许多强大的特性和工具,可以帮助开发者轻松地构建高性能和高可靠性的应用程序。其中,Golang 接口是其最强大和重要的一个特性之一。本文将向您介绍 Golang 接口的用法。一、什么是接口?接口...
    99+
    2023-05-14
  • 深入浅析Java 抽象类和接口
    目录一、抽象类1.抽象类1.1抽象类的定义1.2抽象方法的定义方式1.3抽象类的定义方式2.抽象类和实例类的区别3.抽象类示例4.抽象类的特征二、接口1.接口1.1接口的定义1.1定...
    99+
    2024-04-02
  • 浅析Java中Future接口的使用方法
    目录引言一、Future接口简介二、Future接口的原理三、Future接口的核心方法解析四、Future接口的实现类五、Future接口的源码解读六、Future接口的使用示例结...
    99+
    2023-05-19
    Java Future接口使用方法 Java Future接口使用 Java Future接口
  • JavaAgent实现http接口发布方式浅析
    目录需求初步方案技术实现pom文件依赖实现一个JavaAgent支持SpringBoot发布的Http接口支持DubboX发布的rest接口使用方式总结需求 公司运维系统想要监控服务...
    99+
    2023-03-02
    JavaAgent发布http接口 JavaAgent实现http接口
  • 基于Spring接口集成Caffeine+Redis两级缓存
    目录前言改造JSR107 规范CacheCacheManager配置&使用分布式环境改造定义消息体Redis消息配置消息消费逻辑修改DoubleCache测试总结前言 在上一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作