欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决注入mapper报红的问题

程序员文章站 2022-04-26 10:45:51
...

在spring系列集成mybatis时,我们经常遇到这样的问题:
解决注入mapper报红的问题
明明注入没有问题,但是intellij idea会报红。
这是因为我们没有手动在代码里把mapper接口注入spring容器中,而@Autowired注入方式默认要求注入的对象必须是在spring容器中存在的。
所以idea认为这里的userMapper不存在,而用户(我们)选择注入,是一种错误操作,就报红。解决注入mapper报红的问题

那么怎么解决这个问题呢?
以下提供几种相对比较优雅的方式:(越靠前的笔者越推荐,不过纯属个人建议)
 

Solution 1

使用@Resource来替代@Autowired
解决注入mapper报红的问题
@Resource@Autowired有什么区别?传送门:(之后补上)
 

Solution 2

可以在Mapper接口上增加@Repository注解(或者@Component注解也可)
解决注入mapper报红的问题
这是一种非常直接的解决方案。之前不是说idea认为spring容器里没有mapper对象才报错吗?那就直接点,我们往容器里注入它不就得了。

@Repository,@Service,@Controller,@RestController,@Component之间有什么联系和区别?传送门:(之后补上)
 

Solution 3

使用lombok的@RequiredArgsConstructor注解
例如以下代码:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MyService {
    private final UserMapper userMapper;
    ...
}

经lombok加强后,代码会变为:

@Service
public class TestService {
    private final UserMapper userMapper;
    @Autowired
    public MyService(final UserMapper userMapper) {
        this.userMapper = userMapper;
    }
    ...
}

这种方法有个致命问题。因为在这里lombok把注入方式改为了构造方法注入,一旦出现循环依赖,项目就启动不起来了。
什么叫循环依赖?为什么构造方法注入的循环依赖无法解决?传送门:(之后补上)