注解@Autowire失效的两种情况
一、在静态变量上使用失效
第一种情况是在静态变量上无法使用注解,@Autowire注解自然失效。虽然注入时不会报错,但是当运行时期使用注入的对象时会报空指针异常。
public class demoUtils {
//此时虽然不报错,运行时汇报空指针异常
@Autowired
private static User user;
public static void test(){
user.setName("zql");
System.out.println(user.getName());
}
}
这时就需要new对象,每次都会创建一个对象,在多线程中可能会出现问题,此时可以使用单例模式解决。
public class DemoUtils {
/*@Autowired
private static User user;*/
private static User user = new User();
public static void test(){
user.setName("zql");
System.out.println(user.getName());
}
}
第二种情况:new的对象中使用@Autowire注入其他类
如果有 A,B,C 三个类,在 A 中 new B(),在 B 中使用@Autowire注入 C,此时的@Autowire注解也会失效,C无法注入,运行时报空指针异常。以下是测试。
相当于 A 类。
@RestController
public class AController {
BService bService = new BService();
@GetMapping("/test")
public String test(){
bService.test();
return "正常执行成功";
}
}
相当于 B 类,在注入时正常,运行时报空指针异常。
@Service
public class BService {
//注解失效,运行时会出现空指针异常
@Autowired
CService cService;
public void test(){
cService.testHello();
}
}
相当于 C 类。
@Service
public class CService {
public void testHello(){
System.out.println("hello,world");
}
}
解决方法:在 A 类中使用@Autowire注解来注入 B 。如下所示。
@RestController
public class AController {
//BService bService = new BService();
@Autowired
BService bService;
@GetMapping("/test")
public String test(){
bService.test();
return "正常执行成功";
}
}
当然在 B 中将@Autowire注解注入C,改成new C()也可以(不推荐)。
总的来说:使用@Autowire注解注入,都使用注解注入(推荐,生成的对象交给了Spring管理);使用new,都使用new(不推荐)。
相同的问题,在设置拦截器时也容易出现,相关链接:https://blog.csdn.net/weixin_44457062/article/details/120301571
我们尽量将对象交给Spring管理,因为 B 没有交给 Spring 管理,所以 C 无法交给Spring管理,@Autowire注解失效,本人不是很懂,属于个人观点,如有错误欢迎指正。
以上便是两种情况,如果以后再遇到@Autowire失效的情况会继续添加。