1、高亮警告
先放链接spring官网的Spring Beans and Dependency Injection
看文档的时候看到这,发现官网上的@Autowired注解和自己平时用的有点区别。
众所周知,@Autowired 可以对成员变量、方法以及构造方法三种方式操作。
这是官网的用法
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
如果bean具有一个构造函数,则可以省略@Autowired。
而我在项目中的用法呢,高亮警告,可能之前都没注意,今天打开看了一下内容。

提示信息:总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖。
意思就是,希望用构造函数的方法建立依赖注入,而不希望用@Autowired这种方式直接依赖注入。
所以就改成官网推荐的方式,这种方式需要将bean定义为final,指示该bean随后不能更改。
private final UserService userService;
private final RedisTemplate redisTemplate;
private final StringRedisTemplate stringRedisTemplate;
@Autowired
public UserController(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate, UserService userService) {
this.redisTemplate = redisTemplate;
this.stringRedisTemplate = stringRedisTemplate;
this.userService = userService;
}
为什么要在构造函数上加@Autowired?
因为如果调用了有参的构造函数,会执行注入。 如果没有调用有参构造,只调用无参的构造函数就得加@Autowired 注入。 这样可以避免没有调构造导致的空指针。
Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired
使用构造器注入的方法,可以明确成员变量的加载顺序。
为什么要加final?
网上解释:转载自这篇文章
1、spring配置默认的bean的scope是singleton,也就是启动后一直有。通过设置bean的scope属性为prototype来声明该对象为动态创建。但是,如果你的service本身是singleton,注入只执行一次。@Autowired本身就是单例模式,只会在程序启动时执行一次,即使不定义final也不会初始化第二次,所以这个final是没有意义的吧。可能是为了防止,在程序运行的时候,又执行了一遍构造函数;
2、或者是更容易让人理解的意思,加上final只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。

233

被折叠的 条评论
为什么被折叠?



