以前我们在做spring 项目的时候,一般会使用依赖注入的方式,但是,最近idea 会对这种用法抛出警告。

经过查询,是spring官方推荐使用构造函数注入的方式。那么我们自己去写构造函数,又不方便,要加参数,要加变量的。幸好,我们有Lombok。
一般我们会使用 @AllArgsConstructor ,但是,我们通常会有些不需要注入的属性。所以,我们会换一个@RequiredArgsConstructor 。
做个测试:
UserDao
@Repository
public class UserDao {
public void say(){
System.out.println("ss");
}
}
UserService
@Service
@RequiredArgsConstructor
public class UserService {
@NonNull
private UserDao userDao;
@Value("spring.name")
private String name;
private String test;
public void say(){
userDao.say();
}
public void speak(){
System.out.println("speak");
}
}
来个单元测试类
public class UserServiceTest extends ServiceBaseTest {
@Autowired
private UserService userService;
@Test
public void say(){
userService.say();
}
@Test
public void speak(){
userService.speak();
}
}
debug一下say方法

可见,一切如预期。
那么,如果我们根据单例名称注入呢?这个时候,就不要用构造函数注入了,直接用@Resource既可。当然,如果用构造函数也可以。需要配置lombok.config
lombok.xArgsConstructor.fieldAnnotationTakeOver += org.springframework.beans.factory.annotation.Qualifier
我们写一个interface 做个测试
public interface TagDAO {
public void ss();
}
分别写A,B两个实现
@Repository(value = "tagA")
public class TagAImpl implements TagDAO {
@Override public void ss() {
}
}
@Repository(value = "tagB")
public class TagBImpl implements TagDAO {
@Override public void ss() {
}
}
在UserService 中注入TagDAO
@Resource(name = "tagB") private TagDAO tagDAO;

达到期望
那么,我们试试@MockBean

这里的UserDao 已经变成Mock的了