当前位置:   article > 正文

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

静态类注入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. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/151891
推荐阅读
相关标签
  

闽ICP备14008679号