• SpringBoot在静态方法或工具类中注入Bean及配置参数


    场景一:静态方法或工具类中注入Bean

    示例:

    1. /**
    2. * @author Hoking
    3. * @version 1.0
    4. * @description: 通用工具类型
    5. * @date 2022/5/22 19:36
    6. */
    7. public class CommonUtil {
    8. @Autowired
    9. private static MongoTemplate mongoTemplate;
    10. /**
    11. * 处理mongo数据
    12. */
    13. public static void handleMongoData(){
    14. Object obj = new Object();
    15. mongoTemplate.insert(obj);
    16. }
    17. }

    使用此方式静态对象注入不成功,mongoTemplate 为 null。

    解决方式:

    1、工具类增加@Component注解;

    2、声明工具类的静态对象,即CommonUtil;

    3、使用@PostConstruct注解;

    PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。

    使用要求:

    1、只有一个非静态方法能使用此注解;

    2、被注解的方法不得有任何参数;

    3、被注解的方法返回值必须为void;

    4、被注解方法不得抛出已检查异常;

    5、此方法只会被执行一次;

    调整后示例:

    1. /**
    2. * @author Hoking
    3. * @version 1.0
    4. * @description: 通用工具类型
    5. * @date 2022/5/22 19:36
    6. */
    7. @Component
    8. public class CommonUtil {
    9. @Autowired
    10. private MongoTemplate mongoTemplate;
    11. private static CommonUtil commonUtil;
    12. @PostConstruct
    13. public void init(){
    14. commonUtil = this;
    15. commonUtil.mongoTemplate = this.mongoTemplate;
    16. }
    17. /**
    18. * 处理mongo数据
    19. */
    20. public static void handleMongoData(){
    21. Object obj = new Object();
    22. commonUtil.mongoTemplate.insert(obj);
    23. }
    24. }

    场景二:静态方法或工具类中注入配置参数

    前置:

    1、配置文件yaml配置如下:

    server:

        netty-port: 88480000

    2、工具类中获取server.netty-port数据值;

    示例:

    1. /**
    2. * @author Hoking
    3. * @version 1.0
    4. * @description: 通用工具类型
    5. * @date 2022/5/22 19:36
    6. */
    7. @Slf4j
    8. @Component
    9. public class CommonUtil {
    10. @Value("${server.netty-port}")
    11. public static Integer nettyPort;
    12. @Autowired
    13. private MongoTemplate mongoTemplate;
    14. private static CommonUtil commonUtil;
    15. @PostConstruct
    16. public void init(){
    17. commonUtil = this;
    18. commonUtil.mongoTemplate = this.mongoTemplate;
    19. }
    20. /**
    21. * 处理mongo数据
    22. */
    23. public static void handleMongoData(){
    24. Object obj = new Object();
    25. commonUtil.mongoTemplate.insert(obj);
    26. log.info("Netty-Port: {} 。", nettyPort);
    27. }
    28. }

    示例代码获取不到nettyPort。

    解决方式:

    1、使用场景一中的构造器注入;

    2、使用Setter方法注入;

    调整后示例:

    1. /**
    2. * @author Hoking
    3. * @version 1.0
    4. * @description: 通用工具类型
    5. * @date 2022/5/22 19:36
    6. */
    7. @Slf4j
    8. @Component
    9. public class CommonUtil {
    10. public static Integer nettyPort;
    11. @Autowired
    12. private MongoTemplate mongoTemplate;
    13. private static CommonUtil commonUtil;
    14. @PostConstruct
    15. public void init(){
    16. commonUtil = this;
    17. commonUtil.mongoTemplate = this.mongoTemplate;
    18. }
    19. /**
    20. * 处理mongo数据
    21. */
    22. public static void handleMongoData(){
    23. Object obj = new Object();
    24. commonUtil.mongoTemplate.insert(obj);
    25. log.info("Netty-Port: {} 。", nettyPort);
    26. }
    27. @Value("${server.netty-port}")
    28. public void setNettyPort(Integer nettyPort){
    29. CommonUtil.nettyPort = nettyPort;
    30. }
    31. }

    测试工具类:

    1. /**
    2. * @author Hoking
    3. * @version 1.0
    4. * @description: 测试工具类
    5. * @date 2022/5/22 19:03
    6. */
    7. @RunWith(SpringRunner.class)
    8. @SpringBootTest(classes = AdminApplication.class)
    9. public class StaticBeanAutowiredTest {
    10. @Test
    11. public void test(){
    12. CommonUtil.handleMongoData();
    13. }
    14. }

  • 相关阅读:
    【限时免费】20天拿下华为OD笔试之【不定滑窗】2023Q1A-完美走位【欧弟算法】全网注释最详细分类最全的华为OD真题题解
    Java之~反射,String类型模板匹配类属性方法
    MySQL8.0优化 - MVCC多版本并发控制
    ccf 相邻数对解题思路
    Lombok包依赖的注入
    Python操作lxml库(基础篇)
    Go 语言特性与设计哲学
    Pretrained 预训练模型的加载与使用,为什么可以把不相关的模型用过来?
    【项目笔记】物联网并发5000+Qps (理论上连接百万级设备)搭建全解
    MySQL性能分析工具的使用
  • 原文地址:https://blog.csdn.net/ma_hoking/article/details/124918363