新公司spring代码疑问


@Service
public class ZcDataJdServiceImpl extends ServiceImpl, ZcDataJd> implements IZcDataJdService {

    private final ZcDataLogMapper zcDataLogMapper;

    private final ZcDataMapper zcDataMapper;

    private final SysUserRoleMapper sysUserRoleMapper;

    private final SysRoleMapper sysRoleMapper;

    @Autowired
    public ZcDataJdServiceImpl(ZcDataLogMapper zcDataLogMapper, ZcDataMapper zcDataMapper, SysUserRoleMapper sysUserRoleMapper, SysRoleMapper sysRoleMapper) {
        this.zcDataLogMapper = zcDataLogMapper;
        this.zcDataMapper = zcDataMapper;
        this.sysUserRoleMapper = sysUserRoleMapper;
        this.sysRoleMapper = sysRoleMapper;
    }
}

入职新公司,看项目代码,请问下这里要注入mapper 直接@resource 就好了 ,为啥要这样写,用构造方法,还用final修饰?

总体来说,字段注入和构造器注入的差别不大,毕竟都无法避免循环注入问题。
@Resource 是java自带的注解,@Autowired 是spring的注解,@Autowired 使用场景更灵活。
使用final修饰可以避免mapper对象被二次赋值,不过我感觉可能是为了消除idea自动检测到的警告。

这个是通过spring的构造器注入的,一般来说用final表示类的中的对象不可更改,在构造的时候就初始化了,如果不加final,后续对象可以通过set相关方法去更改对象,如果项目中引入了lombok框架,还可以进行简化成这样

@Service
@AllArgsConstructor
public class ZcDataJdServiceImpl extends ServiceImpl<ZcDataJdMapper, ZcDataJd> implements IZcDataJdService {
 
    private final ZcDataLogMapper zcDataLogMapper;
 
    private final ZcDataMapper zcDataMapper;
 
    private final SysUserRoleMapper sysUserRoleMapper;
 
    private final SysRoleMapper sysRoleMapper;

}


这是属于依赖注入中的构造器构造;
在Spring里面推荐是先构造器,再set注入,再是属性。
构造器注入可以保证注入的bean已经准备好,切如果出现过大的构造器,说明当前类承载的责任过大,应该考虑是否有违背单一职责的原则。
有啥可以在具体翻阅Spring官方文档的相关解读

  • 字段注入的好处是 简单,方便使用; 构造函数注入的好处就是脱离了spring框架,该服务类仍然可以通过 构造方法来实例化,相比字段注入和spring的绑定,构造函数注入便于接入其他依赖注入框架。
  • final 修饰,表示 该注入对象 后续使用 无法被修改,只有通过构造方式初始化。

官方推荐就是这样写法 不过你直接注解一般也不会有啥问题