文章
问答
冒泡
完美解决spring构造函数注入问题

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

spring
构造函数注入

关于作者

落雁沙
非典型码农
获得点赞
文章被阅读