构造注入和@Resources注入选择
一、背景
项目中使用@RequiredArgsConstructor
注解生成构造方法
1.1构造注入代码示例
@Slf4j@Service
@RequiredArgsConstructor
public class UserService extends ServiceImpl<UserDao, User> {
private final CompanyService companyService;
private final RoleService roleService;
private final SmsService smsService;
private final CacheService cacheService;
}
1.2 @Resource注入代码示例
@Slf4j@Service
public class UserService extends ServiceImpl<UserDao, User> {
@Resource
private final CompanyService companyService;
@Resource
private final RoleService roleService;
@Resource
private final SmsService smsService;
@Resource
private final CacheService cacheService;
}
二、出现的问题
循环依赖,众所周知spring
解决set
注入循环依赖问题,@Resource
也一样,那么为什么舍近求远使用构造器注入呢?
spring
官方也是推荐使用构造器注入
The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that
required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.
构造器注入能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能保证完全初始化的状态。
问题来了,上面代码里并没有在类构造初始化形成相互依赖,也没有初始化先后顺序,都是属于类构造成员变量后置处理,对成员变量的使用也是在Spring
启动完成之后。
三、个人的解决
特别的问题,特别的解决方法,不应该默认全局处理。当然如果未来规划建设要拆分服务时,那么使用构造器注入代码的改动相对较少,基于聚合器模式的聚合服务,但使用@Resource
注入也只是代码移动.
服务拆分难点应该也不再这里,那么你会如何选择呢?
以上是 构造注入和@Resources注入选择 的全部内容, 来源链接: utcz.com/z/512636.html