你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

intellij idea java IntelliJ IDEA Java开发:@Autowired导致空指针?这样解决

发布时间:2026-03-26

浏览次数:0

问题原因

针对这个问题,事实上答案较为一致,其实用通俗易懂的说法来讲也能够明白。

1.初始化问题

先看一下Java初始化类的顺序:

父类当中的静态字段,要优先于父类静态代码块,这是其一;子类静态字段,要在子类静态代码块之前,这是其二;父类成员变量,其顺序在父类构造代码块之后,这是其三;父类构造代码块,要先于父类构造器,这是其四;子类成员变量,要在子类构造代码块之后显现,这是其五;子类构造代码块,会在子类构造器之前执行完毕,这是其六。

而注入,那是要排到子类构造器之后的,它并不会针对依赖的bean是否是null去做判断,JVM编译的时候同样不会存在问题,然而要是使用方式不恰当,在运行起来的时候说不定就会因为出现空指针异常。

2.对IOC容易依赖过强

由@提供,@是由JSR - 250所提供的,JSR - 250属于Java标准。前者会发出警告,而后者不会发出警告,其原因在于前者引起了应用于框架的高度密不可分联结,要是把它切换成其他的IOC框架的话intellij idea java,那就无法成功实现注入了。实际上针对这种情况而言,我对此是觉得在多数情形之下不会出现什么问题的。

3.其他方面

有一些网络上其他方面的总结被我看到了,例如,依赖过多然而并不够明显,这违反了单一职责原则 ,并且不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发来进行判断。

对@使用而言,虽说它把业务代码与框架强绑定了,然而字段注入着实极大简化了代码。一味追求彻彻底底的松耦合着实太过理想化,要在实际运用中寻求平衡,不然会因过度追求松耦合而得不偿付出。

其他使用方式

于使用@之外intellij idea java,我们实际上也是存有几种好用的方式的,运用@去替代@方法乃是其中的一种,仅仅只需改变一个注解,此处便不予以展示了。

1.set方法

@RestController
public class TestController2 {
    ITestService testService;
    /*
     * 基于set注入
     * */
    @Autowired
    public void setTestService(ITestService iTestService) {
        this.testService = iTestService;
    }
    @GetMapping("/status2")
    public Result status() {
        return testService.status();
    }
}

这种方法运用了@注解,然而,它是施加于成员变量的函数之处,并非如同Fied注入那般施加于成员变量之上。

2.构造器

@RestController
public class TestController1 {
    ITestService testService;
    /*
    * 基于构造方法的注入
    * */
    public TestController1(ITestService iTestService) {
        this.testService = iTestService;
    }
    @GetMapping("/status1")
    public Result status() {
        return testService.status();
    }
}

它具备的好处是,运用了构造方法注入,这种方式对于对象创建的顺序存在要求,它能够避免循环发生依赖问题,此为极其可靠的方法。

3.构造器的简化版(推荐)

首先,需要引入依赖。


    org.projectlombok
    lombok
    1.18.2

再者,我们于创建之际能够运用@tor注解,此注解会助力我们去创建构造器,final关键字是至关重要不可或缺的。

@RestController
@RequiredArgsConstructor
public class TestController3 {
    /*
     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层
     * */
    private final ITestService testService;
    @GetMapping("/status3")
    public Result status() {
        return testService.status();
    }
}

于使用这般创造方式之际,皆能够调出IDEA的架构面板予以查看,情形呈如下图示。

可以看到,在这个类中,已经存在我们所需要注入的内容。

有博主在网上总结出了一张表,然而由于到处都能见到,所以不清楚原本的出处究竟是哪儿。

总结

于使用期间,运用构造方法是相对可行的,并且,实际上完全能够达成极为简便的效果。

如有侵权请联系删除!

13262879759

微信二维码