【SpringBoot】ApplicationContextAware 与 @Autowired 注解效果是一样,但是时机不一样

本文主要是介绍【SpringBoot】ApplicationContextAware 与 @Autowired 注解效果是一样,但是时机不一样,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、区别

  • ApplicationContextAware 是一个接口,它提供一个方法 setApplicationContext ,当 spring 注册完成之后,会把 ApplicationContext 对象以参数的方式传递到方法里,在方法里我们可以实现自己的逻辑,去获取自己的 bean,当前对接的断言等;一般用在被封装的工具包, starter 包中,方便给其它开发人员调用。
  • @Autowired 是直接给开发人员使用的,直接注入对接类型的 bean 的,开箱即用,对应的注解还有 @Qualifier,或者直接使用 @Resource 注解来实现按 beanName 的注入。

二、案例

1、LindContext 组件

@Component
public class LindContext {public void print() {System.out.println("lind-context print.");}}

2、LindAware 组件

/*** 获取 spring 容器,以访问容器中定义的其它 bean*/
@Component
@Slf4j
public class LindAware implements ApplicationContextAware {// Spring 应用上下文环境private static ApplicationContext applicationContext;private LindContext lindContext;public void contextPrint() {this.lindContext.print();}/*** 重写接口的方法,该方法的参数为框架自动加载的IOC容器对象* 该方法在启动项目的时候会自动执行,前提是该类上有IOC相关注解,例如@Component* @param applicationContext ioc容器* @throws BeansException e*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 将框架加载的ioc赋值给全局静态iocLindAware.applicationContext = applicationContext;if (LindAware.applicationContext.geetBeansOfType(LindContext.class).isEmpty()) {throw new IllegalArgumentException("未加载或者未发现 LindContext 的 bean,请保证它可以正常加载到 spring 容器。")}this.lindContext = LindAware.applicationContext.getBean(LindContext.class);log.info("==================ApplicationContext加载成功==================");}//获取applicationContextpublic static ApplicationContext getApplicationContext() {return applicationContext;}/*** 获取对象* @param name* @return Object 一个以所给名字注册的 bean 的实例(service 注解方式,自动生成以首字母小写的类名为 bean name)*/public static Object getBean(String name){return getApplicationContext().getBean(name);}//通过class获取Bean.public static <T> T getBean(Class<T> clazz){return getApplicationContext().getBean(clazz);}//通过name,以及Clazz返回指定的Beanpublic static <T> T getBean(String name,Class<T> clazz){return getApplicationContext().getBean(name, clazz);}
}

3、controller

public class HelloController {@Autowiredprivate LindAware lindAware;@PostMapping("/test2")public String test2() {lindAware.contextPrint();return "test2 aware success!";}}

4、测试接口

localhost:8080/testUtils/test2

返回结果:

"test2 aware success!"

三、总结

  • 如果将 LindContext 类中 @Component 注解去掉,没有将该 bean 注册到 spring 容器时,调用接口时会在 LindAware 中抛出对应的异常,来提示给开发人员

  •  如果将 LindAware 类中 this.lindContext = LindAware.applicationContext.getBean(LindContext.class); 去掉,调用接口时,会报空指针异常,原因是 LindAware 类中 lindContext 是 null,LindContext 该 bean 没有注入到 LindAware 类中。
java.lang.NullPointerException: nullat com.example.demo.utils.LindAware.contextPrint(LindAware.java:25) ~[classes/:na]at com.example.demo.controller.HelloController.test2(HelloController.java:32) ~[classes/:na]
  • 如果将 LindAware 类中 this.lindContext = LindAware.applicationContext.getBean(LindContext.class); 去掉,在 private LindContext lindContext; 添加上 @Autowired 注解,那么调用接口,是能正常返回结果的。
  • 通过 ApplicationContextAware 拿到的 ApplicationContext,和通过 @Resource 或者 @Autowired 拿到的 ApplicationContext,效果是一样的,时机不一样,但是ApplicationContext只有一个。

四、参考文档

springboot~ApplicationContextAware与@Autowired注解

这篇关于【SpringBoot】ApplicationContextAware 与 @Autowired 注解效果是一样,但是时机不一样的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667493

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd