全局 Bean 注入

前言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、每个类都注入的一大堆的 Bean

2、依赖循环问题 还要手动 spring.main.allow-circular-references=true

3、对于构造器注入,即使开启了依赖循环,仍注入失败,被迫使用 @Lazy + @Autowired

4、想使用依赖静态注入,SpringUtil.getBean(OrgUserRelationService.class); 来获取,获取实现 InitializingBean 来静态注入

--------------------------------

解决思路:

1、封装工具类,使用 $ 符号做为类名

2、一键注入所有的 Bean,(公共 + 静态)

3、后续新的 Bean --- [1] 添加全局变量, [2] 记得 afterPropertiesSet 注入

使用效果

在这里插入图片描述

工具类

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.bozhi.xiaoluo.modules.user;

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.bozhi.xiaoluo.modules.common.sensitive.BaiduService;
import com.bozhi.xiaoluo.modules.common.service.AccusationInfoService;
import com.bozhi.xiaoluo.modules.message.config.ChatProperties;
import com.bozhi.xiaoluo.modules.message.service.ChatMessageService;
import com.bozhi.xiaoluo.modules.post.service.ChooseInfoService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.locks.LockSupport;
import java.util.stream.Collectors;

/**
* Spring Bean 静态调用工具类
*
* <pre>
* $.userInfoService.updateUserLevelScore();
*
* UserInfoEntity user = $.userInfoService.getById(3439L);
* </pre>
*/
@Component
public class $ implements InitializingBean {

public static AccusationInfoService accusationInfoService;
public static BaiduService baiduService;
public static ChatMessageService chatMessageService;
public static ChatProperties chatProperties;
public static ChooseInfoService chooseInfoService;

@Override
public void afterPropertiesSet() {
accusationInfoService = SpringUtil.getBean(AccusationInfoService.class);
baiduService = SpringUtil.getBean(BaiduService.class);
chatMessageService = SpringUtil.getBean(ChatMessageService.class);
chatProperties = SpringUtil.getBean(ChatProperties.class);
chooseInfoService = SpringUtil.getBean(ChooseInfoService.class);
}
}

// 生成
// @Component// 解除注释来一键生成
class Generate$ implements ApplicationRunner {

@Override
public void run(ApplicationArguments args) {
Console.log("=======================================================================");
List<String> beanNames = SpringUtil.getBeanFactory().getBeansOfType(Object.class).values().stream()
// [1] 包名过滤
.filter(bean -> bean.getClass().getName().contains("bozhi"))
// [2] 获取 beanName
.map(bean -> bean.getClass().getSimpleName().split("\\$\\$")[0].replace("Impl", ""))
// [3] 过滤含有这些名称的 beanName
.filter(beanName -> !StrUtil.containsAnyIgnoreCase(beanName,
"xiaoluo", "controller", "dao", "token", "filter", "job", "listen", "exception", "config", "$"
))
// [4] 字母顺序排序
.sorted()
.collect(Collectors.toList());

// [5] 生成:全局变量
beanNames.forEach(beanName -> Console.log(" public static {} {};", beanName, StrUtil.lowerFirst(beanName)));

// [6] 生成:变量注入
Console.log(" @Override");
Console.log(" public void afterPropertiesSet() {");
beanNames.forEach(beanName -> Console.log(" {} = SpringUtil.getBean({}.class);", StrUtil.lowerFirst(beanName), beanName));
Console.log(" }");

// [7] 无限阻塞
Console.log("=======================================================================");
Console.log("$ 生成完成,项目启动将无限阻塞");
Console.log("=======================================================================");
LockSupport.park();
}
}