spring学习路上遇到的问题

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只会在程序启动的时候初始化一次,并且在程序运行的时候不会再改变。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值