@PostConstruct - 静态方法调用IOC容器Bean对象
需求:工具类里引用IOC容器中的Bean,强迫症患者在调用工具类时喜欢用静态方法的方式而非注入的方式去调用,但是spring 不支持注解注入静态成员变量。
- 静态变量/类变量不是对象的属性,而是一个类的属性,spring是基于对象层面的依赖注入。静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring忽略静态变量。
举个栗子:
@Component
public class MessageUtil { @Resource
private static MerchantService merchantService; public static void getMerchant1(Long id) {
System.out.println(merchantService.getMerchantByMchId(id));
}
}
调用
注入方式调用工具类
@Resource
private MessageUtil messageUtil;
public void ttt1() {
messageUtil.getMerchant1(2L);
} 静态方法调用工具类
public void ttt() {
MessageUtil.getMerchant(2L);
}
可以将对象托管给spring管理。
- 执行过程如下:①在IOC容器初始化的时候创建实例对象 ②执行完构造函数 ③执行注解@Resource ④执行PostConstruct注解。
- 这里解释为什么不能在构造函数中但可以用PostConstruct借用注解注入的对象赋值静态属性。因为构造函数执行的时候,注解中的对象还未执行,为null;而PostConstruct是在注解注入对象之后执行
利用@PostConstruct注解可以解决该问题
代码如下 - 2种写法。原理一致。
@Component
public class MessageUtil { @Resource
private MerchantService merchantService; private static MerchantService merchantServiceStatic; /**
* 需求是 : 要在静态方法里面调用IOC容器的bean对象
* PostConstruct 在构造函数执行之后执行。
* 可以方便的把注入的bean对象给到静态属性
*/
@PostConstruct
public void postConstruct() {
merchantServiceStatic = this.merchantService;
} public static void getMerchant(Long id) {
System.out.println(merchantServiceStatic.getMerchantByMchId(id));
} }
@Component
public class MessageUtil { @Resource
private MerchantService merchantService; private static MessageUtil messageUtil; /**
* 需求是 : 要在静态方法里面调用IOC容器的bean对象
* PostConstruct 在构造函数执行之后执行。
* 可以方便的把注入的bean对象给到静态属性
*/
@PostConstruct
public void postConstruct() {
messageUtil = this;
} public static void getMerchant(Long id) {
System.out.println(messageUtil.merchantService.getMerchantByMchId(id));
} }
如果工具类需要注入的对象较多,推荐第二种。这样代码比较少。
如果需要注入的对象只有一个,推荐第一种,语义比较清晰
@PostConstruct注解原理参考 https://www.jianshu.com/p/98cf7d8b9ec3
@PostConstruct - 静态方法调用IOC容器Bean对象的更多相关文章
- spring深入学习(二)-----bean的生命周期、IOC容器bean装配
bean的生命周期 1.实例化Bean对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBea ...
- 获取Spring容器Bean对象工具类
在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题.为了解决这个问题,我们需要一个工具类来直接获取Spring容器中的bean.因此就写了这个工具类,在此记录一下,方便后续查阅. ...
- 【Spring】Spring之向 IOC 容器注入对象的三种方式
关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...
- 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管
可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器 比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入sprin ...
- Spring IOC的Bean对象
---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...
- IoC容器-Bean管理(bean作用域)
IoC操作Bean管理(bean作用域) 1,在Spring里面,设置创建bean实例是单实例还是多实例 2,在Spring里面,默认情况下,bean是单实例对象 3,如何设置单实例还是多实例 (1) ...
- IoC容器-Bean管理注解方式(创建对象)
IoC操作Bean管理(基于注解方式) 1,什么是注解 (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...) (2)使用注解,注解作用在类上面,方法上面,属性上面 ( ...
- IoC容器-Bean管理XML方式(创建对象和set注入属性,有参构造注入属性)
Ioc操作Bean管理 1,什么是Bean管理 (0)Bean管理指的是两个操作 (1)Spring创建对象 (2)Spring注入属性 2,Bean管理操作有两种方式 (1)基于xml配置文件方式实 ...
- IoC容器-Bean管理XML方式(引入外部属性文件)
IoC操作Bean管理(引入外部属性文件) 1,直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池依赖jar包 2,通过引入外部属性文件配置数据库连接池 (1)创建外部属性文件,pro ...
随机推荐
- 5 其他命令-学习目标以及find命令的基本使用
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- yml和properties的加载顺序和区别
正常的情况是先加载yml,接下来加载properties文件.如果相同的配置存在于两个文件中.最后会使用properties中的配置.最后读取的优先集最高. 两个配置文件中的端口号不一样会读取prop ...
- CF1062F Upgrading Cities
题意 由于这是个\(DAG\),我们考虑拓朴排序,求某个点能到的和能到它的点,这是两个问题,我们可以正反两边拓朴排序,这样就只用考虑它能到的点了 设\(f[x]\)表示\(x\)能到的点数\(+\)能 ...
- Vue 小练习01
有红, 黄, 蓝三个按钮, 以及一个200X200px的矩形box, 点击不同的按钮, box的颜色会被切换为指定的颜色 <!DOCTYPE html> <html lang=&qu ...
- 什么是面向对象编程(OOP)?
Java 程序员第一个要了解的基础概念就是:什么是面向对象编程(OOP)? 玩过 DOTA2 (一款推塔杀人的游戏)吗?里面有个齐天大圣的角色,欧洲战队玩的很溜,国内战队却不怎么会玩,自家人不会玩自家 ...
- C++ 面向对象程序设计复习大纲
这是我在准备C++考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题会 ...
- Quartz.NET总结(三)如配置jobs
前两篇文章,已经介绍了Quartz.NET的使用和Cron表达式表达式的写法,今天说一说Quartz的配置,Quartz相关的配置有三个quartz.config.quartz_jobs.xml.lo ...
- 双链表算法原理【Java实现】(八)
前言 前面两节内容我们详细介绍了ArrayList,一是手写实现ArrayList数据结构,而是通过分析ArrayList源码看看内置实现,关于集合内容一如既往,本节课我们继续学习集合LinkedLi ...
- 一起学Android之ContentProvider
本文主要讲解在Android开发中ContentProvider的常规用法,仅供学习分享使用,如有不足之处,还请指正. 访问一个ContentProvider 在Android开发中,应用程序通过Co ...
- JPA的entityManager的find方法与getReference方法的区别
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...