springboot单例模式注入对象_Spring Boot 单例模式中依赖注入问题

本文探讨了在 Spring Boot 单例模式下,使用 @Resource 或 @Autowired 注解注入 Service 实例导致的 NullPointException 问题。问题源于静态单例对象初始化早于 Spring 容器,因此无法自动注入。解决方案包括手动实例化 Service 或利用 SpringContextUtils 动态获取 Bean。通过示例代码展示了手动实例化存在的限制,并提供了最终的工具类方法作为有效解决方案。
摘要由CSDN通过智能技术生成

在日常项目开发中,单例模式可以说是最常用到的设计模式,项目也常常在单例模式中需要使用 Service 逻辑层的方法来实现某些功能。通常可能会使用 @Resource 或者 @Autowired 来自动注入实例,然而这种方法在单例模式中却会出现 NullPointException 的问题。那么本篇就此问题做一下研究。

问题初探

一般我们的项目是分层开发的,最经典的可能就是下面这种结构:1

2

3├── UserDao -- DAO 层,负责和数据源交互,获取数据。

├── UserService -- 服务逻辑层,负责业务逻辑实现。

└── UserController -- 控制层,负责提供与外界交互的接口。

此时需要一个单例对象,此对象需要 UserService 来提供用户服务。代码如下:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27@Slf4j

public class UserSingleton{

private static volatile UserSingleton INSTANCE;

@Resource

private UserService userService;

public static UserSingleton getInstance(){

if (null == INSTANCE) {

synchronized (UserSingleton.class) {

if (null == INSTANCE) {

INSTANCE = new UserSingleton();

}

}

}

return INSTANCE;

}

public String getUser(){

if (null == userService) {

log.debug("UserSingleton userService is null");

return "UserSingleton Exception: userService is null";

}

return userService.getUser();

}

}

然后创建一个 UserController 来调用 UserSingleton.getUser() 方法看看返回数据是什么。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26@RestController

public class UserController{

@Resource

private UserService userService;

/**

* 正常方式,在 Controller 自动注入 Service。

*

* @return user info

*/

@GetMapping("/user")

public String getUser(){

return userService.getUser();

}

/**

* 使用单例对象中自动注入的 UserService 的方法

*

* @return UserSingleton Exception: userService is null

*/

@GetMapping("/user/singleton/ioc")

pub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值