@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官方文档的相关解读
官方推荐就是这样写法 不过你直接注解一般也不会有啥问题