springBoot中关于非controller或service类中用@Autowired 注解报空指针的问题

最近做东西的时候遇到这样一个问题,自己写的demo集成在项目中报 java.lang.NullPointerException,但是在demo中可以正确运行。经过debug查找发现问题是@Autowired注解的对象为空,这就奇怪了,在demo中也是这样注解反而放在项目中就出错,后来经过一番百度但凡这样的问题都是同一个解决办法。现在我将该方法分享出来,希望能帮助到更多的朋友!

我的错误代码

public class Test {
	@Autowired
	private UserSender userSender;
	public static void main(String[] args) throws InterruptedException {
		int count= 0 ;
		while(count<10) {
			userSender.send("UserSender..... "+count);
			Thread.sleep(2000);
			count++;
		}
	}
}

 

首先解释一下@Autowired这个注解

在SpringMVC框架中,我们经常要使用@Autowired注解注入Service或者Mapper接口,我们也知道,在controller层中注入service接口,在service层中注入其它的service接口或者mapper接口都是可以的,但是在我们自己定义的非controller或者service类中用@Autowired直接注入是不可能的,但是我们可以用下面的方式解决这个不能直接注入的问题。

我的正确代码

@SpringBootApplication
public class RabbitmqTopicProviderApplication {
	@Autowired
	private UserSender userSender;
	public static RabbitmqTopicProviderApplication rabbitmqTopicProviderApplication;
	@PostConstruct//在初始化的时候初始化静态对象和它的静态成员变量bean对象,静态存储下来,防止被释放
    public void init() {
		rabbitmqTopicProviderApplication = this;
		rabbitmqTopicProviderApplication.userSender = this.userSender;
	}
	public static void main(String[] args) throws InterruptedException {
		SpringApplication.run(RabbitmqTopicProviderApplication.class, args);
		int count= 0 ;
		while(count<10) {
            //方法调用
			rabbitmqTopicProviderApplication.userSender.send("UserSender..... "+count);
			Thread.sleep(2000);
			count++;
		}
	}

}

 

注:@PostConstruct的启动时间是在 SpringBeans初始化时执行,SpringApplication.run() 之前执行

注:我的demo是测试是写在springBoot的单元测试中,我在项目中是放在springBoot的启动类中,但如果是自己定义的测试类上面的方法行不通,因为@Autowired注解,必须要在项目启动注册了bean之后才能注入相应的类,自己写的测试类并没有启动springBoot,而@PostConstruct注解在初始化的时候初始化静态对象和它的静态成员变量bean对象,静态存储下来,防止被释放。

感兴趣的朋友可以去了解下@PostConstruct这个注解,我的问题就是这样解决的。

另外还有一个SpringBoot神器也可以实现在初始化执行---SpringBoot神器-------CommandLineRunner 解决项目启动时初始化资源

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值