以前我们在做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的了