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++;
		}
	}

}

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

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

猜你喜欢

转载自blog.csdn.net/Websphere_zxf/article/details/89455037