发布时间: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的架构面板予以查看,情形呈如下图示。
可以看到,在这个类中,已经存在我们所需要注入的内容。
有博主在网上总结出了一张表,然而由于到处都能见到,所以不清楚原本的出处究竟是哪儿。
总结
于使用期间,运用构造方法是相对可行的,并且,实际上完全能够达成极为简便的效果。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码