@Autowired的使用--Spring规范解释,推荐对构造函数进行注释 - 云+社区 - 腾讯云
- 在编写代码的时候,使用 @Autowired 注解是,发现 IDE 报的一个警告,如下:
-
Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies.
-
翻译: Spring 建议,总是在您的 bean 中使用构造函数建立依赖注入。总是使用断言强制依赖,那么是为什么呢?
- 我们可以理一下 java 的基础点,不考虑父类,初始化的顺序
-
静态变量或静态语句块–> 实例变量或初始化语句块–> 构造方法–>@Autowired
-
ps.静态变量或静态语句块的初始化顺序是自上到下的顺序,被老大问到了...
- 好的,有了上面的铺垫,我们来看看下面的代码。
-
@Autowiredprivate User user;private School school;public UserServiceImpl(){ this.school.id = user.getSchoolId();}
-
由于 java 先执行构造方法,导致 this.school = user.getSchool();
报空指针异常(虽然这个例子正常人都不会这样写)... 解决办法就是 使用构造器注入了
-
private User user;private String schoolId;@Autowiredpublic UserServiceImpl(User user){ this.user = user; this.schoolId = user.getSchoolId();}
-
而且若是你是个单例的模式(bean 没写 @scope,默认为单例,
那么 spring 还建议你在 bean 的声明上加 final,这个的解析就简单粗暴了
- 因为加上 final 只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。
官方的建议例子
- private final EnterpriseDbService service; @Autowired public EnterpriseDbController(EnterpriseDbService service) { this.service = service; }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于