@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.静态变量或静态语句块的初始化顺序是自上到下的顺序,被老大问到了...
三
好的,有了上面的铺垫,我们来看看下面的代码。
@Autowired
private User user;
private School school; public UserServiceImpl(){
this.school.id = user.getSchoolId();
}
由于java先执行构造方法,导致
this.school = user.getSchool();
报空指针异常(虽然这个例子正常人都不会这样写...
解决办法就是使用构造器注入了
private User user;
private String schoolId; @Autowired
public 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;
}
@Autowired的使用--Spring规范解释,推荐对构造函数进行注释的更多相关文章
- @Autowired的使用:推荐对构造函数进行注释
在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下: Spring Team recommends "Always use constructor based d ...
- Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!
GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...
- Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...
- 你可能使用了Spring最不推荐的注解方式
前言 使用Spring框架最核心的两个功能就是IOC和AOP.IOC也就是控制反转,我们将类的实例化.依赖关系等都交由Spring来处理,以达到解耦合.利用复用.利于测试.设计出更优良程序的目的.而对 ...
- spring/spring boot/spring cloud书籍推荐
最近看了一些spring书籍,主要都是工作需要,实话说,没有必要买这么多书,每个主题一本就足够了,其他的补充可以通过项目实战和上网看官网或者博客补充. 说是推荐,其实只是一些简单读后感想而已,每本书都 ...
- Action中如何通过@Autowired自动注入spring bean ?
1.讲Action纳入spring的IOC控制 <!-- 采用注解方式自动扫描装配 --> <context:component-scan base-package="co ...
- new出来的对象无法调用@Autowired注入的Spring Bean
@Autowired注入Spring Bean,则当前类必须也是Spring Bean才能调用它,不能用new xxx()来获得对象,这种方式获得的对象无法调用@Autowired注入的Bean. 1 ...
- Spring Taco Cloud——Controller的创建(含SpringMVC执行过程&SpringBoot&Spring三者解释及关联)
在记录这次控制器编写前,对于Spring的感觉就是经常提这样代码好简洁,这样好方便,这个是用来干嘛的诸如之类的话. What is Spring ?这是我想问自己的,一直认为是简化代码利于工程的开源框 ...
- 注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩...
如果你是Spring Boot用户的话,一定有这样的开发体验,当我们要引入某个功能的时候,只需要在maven或gradle的配置中直接引入对应的Starter,马上就可以使用了,而不需要像传统Spri ...
随机推荐
- ACM学习历程—HDU 5289 Assignment(线段树 || RMQ || 单调队列)
Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...
- WPF开发学习笔记(转)
总结下学习WPF的笔记,方便查阅 1 编译 添加程序集引用:WindowsBase.dll,PresentationCore.dll,PresentationFramework.dll 2 布局 ...
- 如何让Surface RT支持网站的flash
Go to the desktop version of IE10, hit the click ALT button on your keyboard, click on and then Comp ...
- c# namespace不能和class的name 相同
比如namespace A, 内部Class A, 那么调用class A的方法只能通过A.A.XXX来访问. 或者说实例化一个class A, A a = new A(); // compile ...
- MyEclipse修改Servlet模板
进入myeclipse的安装路径 然后进入plugins文件夹 打开搜索框,输入 *wizard* 找到名字是 com.genuitec.eclipse.wizards_11.5.0.me201310 ...
- shell里的` ` $( ) ${ } expr $(( ))
转自:http://blog.sina.com.cn/s/blog_6151984a0100ekz2.html 所有UNIX命令,要取结果或输出,都要用$( )或反引号` ` tt=` file te ...
- 【转】python的复制,深拷贝和浅拷贝的区别
在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...
- ceph应用情况分析
1.概述 ceph是分布式的开源存储系统,同时支持块存储.对象存储和文件系统,ceph可以满足高性能.高可靠性和高扩展等特性. 目前ceph作为开源分布式存储已经被大量使用,尤其是在云环境下的应用,下 ...
- C++制作电压表电流表仪表盘(vs2008)
Meter类 Meter.h #if !defined(AFX_METER_H__D5802279_6502_4453_BE21_58604877AD39__INCLUDED_) #define AF ...
- gSoap使用入门(2)----自定义接口头文件
摘自:http://blog.csdn.net/zhuzhihai1988/article/details/8131556 接口头文件的格式在向导中没有看到明确的说明性的内容,但通过看开发包中示例程序 ...